900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > android jni 返回java类

android jni 返回java类

时间:2020-12-05 12:58:08

相关推荐

android jni 返回java类

今天,简单讲讲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类就讲完了。

就这么简单。



本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。