Android-NDK/JNI

Android NDK开发:Native层实例化Java对象

2019-07-23  本文已影响8人  itfitness

创建实体类

这个实体类将通过Native方法创建并返回。

public class Student {
    private String name ;
    private int age

    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;
    }
}

声明Native方法

public native Student getStudent(String name,int age);

C代码中实现Native方法

Java方法签名的获取方式请查看Android NDK开发:Native层利用反射调用Java层方法

JNIEXPORT jobject JNICALL Java_com_itfitness_ndkdemo01_MainActivity_getStudent
(JNIEnv* env, jobject jobj, jstring name, jint age) {
    //1.找到类
    jclass clazz = (*env)->FindClass(env,"com/itfitness/ndkdemo01/Student");//最后一个参数是实体类的全路径
    //2.找方法
    jmethodID setName = (*env)->GetMethodID(env,clazz,"setName","(Ljava/lang/String;)V");//最后一个参数是方法的签名
    jmethodID setAge= (*env)->GetMethodID(env, clazz, "setAge", "(I)V");
    //3.获取对象
    jobject studentObj = (*env)->AllocObject(env,clazz);
    //4.执行对象方法
    (*env)->CallVoidMethod(env,studentObj,setName,name);
    (*env)->CallVoidMethod(env, studentObj, setAge, age);
    return studentObj;
}

Java代码中进行调用

这里通过按钮进行调用。

        mBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Student student = getStudent("李四", 23);
                Toast.makeText(MainActivity.this, student.getName() + "====="+student.getAge(), Toast.LENGTH_SHORT).show();
            }
        });

调用结果

上一篇 下一篇

猜你喜欢

热点阅读