Android JNI开发时经常遇到C/C++层访问Java层对象的,比如C/C++层创建一个String返回,或者访问Java层提供的MediaCodec等,此时我们就需要通过 JNI 来调用 Java 一个类的构造方法来创建这个 Java 类。
调用构造方法
构造方法是特殊的类方法,但是调用构造方法和之前调用类的实例方法步骤类似,也需要获得对应的类的jclass和方法 id。
-
对于类,通过 FindClass 可以找到对应的 Java 类型。
-
对于构造方法,通过 GetMethodID 方法来获取它的方法ID,不同的是构造方法对应的名称为
<init>
,返回值类型是 void 。 -
通过 NewObject传入获取到的构造方法id 来调用构造方法创建具体的类。
下面以 String 的字符数组构造方法为例在C/C++层实现对象的创建。
public String(char value[])
对应的 C++ 代码:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_qingkouwei_demo_InvokeDemo_invokeStringConstructors(JNIEnv *env, jobject instance) {
jclass stringClass;
jmethodID cid;
jcharArray elemArr;
jstring result;
// 创建string字符串
jstring temp = env->NewStringUTF("this