今天,简单讲讲android 在jni中如何返回一个java的类。
之前,我写了一些关于jni的博客,里面返回的都是简单的int类型,那么如果我需要返回很多int和String类型,那么怎么办呢?当然是在java里写一个类,把需要返回的变量封装成类之间返回。我在网上搜索了资料,终于解决了这个问题。这里记录一下。
在Native层返回一个复杂对象(即一个类咯)
使用的类非常简单,如下:
Student.java类
package com.feixun.jni;public class Student{private int age ;private String name ;//构造函数,什么都不做public Student(){ }public Student(int age ,String name){this.age = age ;this.name = name ;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name){this.name = name;}public String toString(){return "name --- >" + name + " age --->" + age ;}}
Java层的方法对应为:
public class HelloJni {...//在Native层返回一个Student对象public native Student nativeGetStudentInfo() ;...}
Native层该方法实现为 :
/** Class:com_feixun_jni_HelloJni* Method: nativeGetStudentInfo* Signature: ()Lcom/feixun/jni/Student;*///返回一个复杂对象JNIEXPORT jobject JNICALL Java_com_feixun_jni_HelloJni_nativeGetStudentInfo(JNIEnv * env, jobject obl){//关于包描述符,这儿可以是 com/feixun/jni/Student 或者是 Lcom/feixun/jni/Student; // 这两种类型 都可以获得class引用jclass stucls = env->FindClass("com/feixun/jni/Student"); //或得Student类引用//获得得该类型的构造函数 函数名为 <init> 返回类型必须为 void 即 VjmethodID constrocMID = env->GetMethodID(stucls,"<init>","(ILjava/lang/String;)V");jstring str = env->NewStringUTF(" come from Native ");jobject stu_ojb = env->NewObject(stucls,constrocMID,11,str); //构造一个对象,调用该类的构造函数,并且传递参数return stu_ojb ;}
这里简单讲讲,在jni里主要是通过env->FindClass("com/feixun/jni/Student")找到类id,里面的参数就是类的路径。然后通过类id找到了类的构造函数id,这里env->GetMethodID(stucls,"<init>","(ILjava/lang/String;)V");的参数第一个是类id,<init>是初始化函数的名称,(ILjava/lang/String;)V对应的是构造函数的参数和返回值,之歌需要了解jni和java变量的对应规则,大家可以自己去网上查找资料。
android jni 返回java类就讲完了。
就这么简单。