1、声明native方法

public class ComplexObject {

	/**
* 返回一个对象数组
* @param val
* @return
*/
public native Person[] receiverBeanArray(String val); /**
* 获取对象
* @return
*/
public native Person getPerson(); /**
* 获取对象的集合
* @return
*/
public native ArrayList<Person> getPersonList(); }

2、Person类对象

有两个构造函数,主要是为了在jni中通过不同的构造函数来创建Person对象。

public class Person {

	public String name;
private int age; public Person() {
super();
} public Person(int age, String name) {
super();
this.age = age;
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }

3、jni操作实现

JNI中,构造函数可以和实例方法一样被调用,调用方式也相似。传入“<init>”作为方法名,“V”作为返回类型。你可以通过向JNI函数NewObject传入方法来调用构造函数。

/**
* 拼接字符串
*/
char* strJoin(char *s1, char *s2) {
char *result = malloc(strlen(s1) + strlen(s2) + 1);
if (result == NULL)
exit(1);
strcpy(result, s1);
strcat(result, s2);
return result;
}
/**
* 返回一个数组类型到Java
*/
JNIEXPORT jobjectArray JNICALL Java_com_example_jniandroid_service_ComplexObject_receiverBeanArray
(JNIEnv * env, jobject obj , jstring string) {
jclass objClass = (*env)->FindClass(env, "java/lang/Object");
jobjectArray mails = (*env)->NewObjectArray(env, (jsize) ARRAY_LENGTH,objClass, 0);
jclass personClass = (*env)->FindClass(env,"com/example/jniandroid/bean/Person"); jfieldID field_name = (*env)->GetFieldID(env, personClass, "name","Ljava/lang/String;");
jmethodID construction_id = (*env)->GetMethodID(env, personClass, "<init>","()V");
jfieldID field_age = (*env)->GetFieldID(env,personClass, "age", "I");
jclass mPerson = (*env)->NewObject(env, personClass, construction_id); int i = 0;
//将jstring类型转成char*
char* nameStr = (char*)(*env)->GetStringUTFChars(env,string, 0);
//拼接字符串
const char* name = strJoin(nameStr,"-join jni");
LOGD("数组总和 =%s", name);
for (; i < ARRAY_LENGTH; i++) {
int age = 20+i;
//将Java的字符串和c的字符串进行拼接后赋值给name属性
(*env)->SetObjectField(env, mPerson, field_name, (*env)->NewStringUTF(env,name));
(*env)->SetIntField(env,mPerson, field_age,age);
(*env)->SetObjectArrayElement(env, mails, (jsize)i, mPerson);
}
return mails;
} /**
* 在jni中给Java对象设置值并返回
*/
JNIEXPORT jobject JNICALL Java_com_example_jniandroid_service_ComplexObject_getPerson
(JNIEnv * env, jclass obj) {
//找到Person类
jclass m_cls = (*env)->FindClass(env,"com/example/jniandroid/bean/Person");
//无参数的构造方法
jmethodID m_mid = (*env)->GetMethodID(env,m_cls, "<init>", "()V");
//获取Java中复杂类型以L开始;结尾,中间是类型将.改成/
jfieldID m_fid_name = (*env)->GetFieldID(env,m_cls, "name", "Ljava/lang/String;");
//基本类型,I表示Java中的int
jfieldID m_fid_age = (*env)->GetFieldID(env,m_cls, "age", "I"); if(m_fid_name==NULL){
printf("m_fid_name is null ");
return;
}
if(m_fid_age==NULL){
printf("m_fid_age is null ");
return;
} jobject m_obj = (*env)->NewObject(env,m_cls, m_mid); (*env)->SetObjectField(env,m_obj, m_fid_name, (*env)->NewStringUTF(env,"Set the name Person object in the JNI value"));
(*env)->SetIntField(env,m_obj, m_fid_age,96); return m_obj;
} /**
* 返回ArrayList集合
*/
JNIEXPORT jobject JNICALL Java_com_example_jniandroid_service_ComplexObject_getPersonList(
JNIEnv * env, jobject obj) {
jclass list_cls = (*env)->FindClass(env, "java/util/ArrayList"); //获得ArrayList类引用 jmethodID list_costruct = (*env)->GetMethodID(env, list_cls, "<init>","()V"); //获得得构造函数Id
jobject list_obj = (*env)->NewObject(env, list_cls, list_costruct); //创建一个Arraylist集合对象
//Arraylist类中的 add()方法ID,其方法原型为: boolean add(Object object) ,boolean类型对应的是Z;
jmethodID list_add = (*env)->GetMethodID(env, list_cls, "add","(Ljava/lang/Object;)Z"); jclass personClass = (*env)->FindClass(env,"com/example/jniandroid/bean/Person"); //获得Person类引用
//获得该类型的构造函数 函数名为 <init> 返回类型必须为 void 即 V
jmethodID person_costruct = (*env)->GetMethodID(env, personClass, "<init>","(ILjava/lang/String;)V");
int i=0;
for (; i < 5; i++) {
jstring str = (*env)->NewStringUTF(env, "jni Native");
//通过调用该对象的构造函数来new 一个 Student实例
jobject person_obj = (*env)->NewObject(env, personClass,person_costruct, i, str); //构造一个对象
//执行Arraylist类实例的add方法,添加一个Person对象
(*env)->CallBooleanMethod(env,list_obj, list_add, person_obj);
}
return list_obj;
}

JNI由浅入深_6_简单对象的应用的更多相关文章

  1. JNI由浅入深_10_JNI 综合开发

    1.使用ndk-build时如果找不到某个类,可以使用下面两种方法解决: 1.1 进入src目录 D:\project3\JNIAndroid\src>set classpath=D:\proj ...

  2. JNI由浅入深_9_JNI 异常处理

    1 .本地代码中如何缓存和抛出异常 下面的代码中演示了如何声明一个会抛出异常的本地方法.CatchThrow这个类声明了一个会抛出IllegalArgumentException异常的名叫doit的本 ...

  3. JNI由浅入深_8_JNI缓存字段和方法ID

    获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存 ...

  4. JNI由浅入深_7_c调用Java方法一

    1.在Java中声明方法 <span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.exam ...

  5. JNI由浅入深_5_基本类型应用

    1.基本类型应用 对于JNI处理基本类型还是比较简单的,下面是Java代码: <span style="font-size:14px;"> public native ...

  6. JNI由浅入深_4_JNI基础知识详解

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  7. JNI由浅入深_3_Hello World

    1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin ...

  8. JNI由浅入深_2_C语言基础

    *含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址 ...

  9. Java JNI 编程进阶 实例+c++数据类型与jni数据类型转换

    原文:http://www.iteye.com/topic/295776 JNI一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,J ...

随机推荐

  1. windows查看当前python的版本

    1.Ctrl+R打开控制台 输入python之后回车

  2. CSS Align bottom

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. 【转载】shell实例手册

    原文地址:shell实例手册  作者:没头脑的土豆 shell实例手册 0说明{ 手册制作: 雪松 更新日期: -- 欢迎系统运维加入Q群: 请使用"notepad++"打开此文档 ...

  4. 浏览器根对象window之值为字符串的属性

    1. string属性 1.1 origin window.origin使用返回的是当前网页的网址.打开百度首页,并在控制台中输入 window.origin 控制台中会输出"https:/ ...

  5. 【MFC】CHtmlView::GetSource中文乱码的问题

    在MFC的SDI中,使用CHtmlView::GetSource来获取网页源码,保存到本地,发现中文中的一部分乱码,有些中文正常.自己先试着转码等各种尝试,发现一无所获.网上也没有正确的解决方案. 自 ...

  6. 使用PuTTy在CentOS下安装web.py与简单的文件传输

    两周前,出于帮朋友忙的目的,尝试了一下微信公众号的菜单自定义与自动回复功能的实现,成了. 两周后,需要将代码转移至朋友新购的服务器上,发现基本操作全忘记了,麻瓜!所以记一笔,希望也能对大家也有帮助. ...

  7. PHP进阶知识总结

    周末梳理了下这段时间看书的一些知识点,进步的过程不仅要实践,还要安排多看书.思考.总结. 只针对知识点进行了罗列和简单说明,很多细节还未整理好,待后面再专门详细写. 基础易忽略概念 PHP是一个支持面 ...

  8. 简析 Tomcat 、Nginx 与 Apache 的区别

    简析 Tomcat .Nginx 与 Apache 的区别 本文讲的是简析 Tomcat .Nginx 与Apache的区别, 经常在用 apache 和 tomcat 等这些服务器,可是总感觉还是不 ...

  9. 秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

    http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些 ...

  10. Quick BI助力云上大数据分析---深圳云栖大会

    在3月29日深圳云栖大会的数据分析与可视化专场中,阿里云产品专家陌停对大数据智能分析产品 Quick BI 进行了深入的剖析.大会现场的精彩分享也赢得观众们的一直认可和热烈的反响. 大数据分析之路的挑 ...