JNI 访问 Java 的构造函数,有两种写法
//第一种
env->NewObject(cls, init);
//第二种
方式一:NewObject
Util.java 类
public class Util {
int age = 100;
//这个方法 c 调用,创建对象
public Util() {
Log.d("util-", "init");
}
}
在 Activity 中声明 getUtil 方法。如下:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("util--", "" + getUtil().age)
}
external fun getUtil(): Util
companion object {
// Used to load the 'native-lib' library on application startup.
init {
System.loadLibrary("native-lib")
}
}
}
c 代码实现 getUtil 方法,并且返回 Util 对象实例
extern "C"
JNIEXPORT jobject JNICALL
Java_com_example_myapplication_MainActivity_getUtil(JNIEnv *env, jobject thiz) {
jclass cls = env->FindClass("com/example/myapplication/Util");
//调用无参构造函数
//构造函数是没有函数名的,<init> 就代表构造函数. ()V 代表无参无返回值
jmethodID init = env->GetMethodID(cls, "<init>", "()V");
//创建实例
jobject util = env->NewObject(cls, init);
return util;
}
输出日志:
D/util-: init
D/util--: 100
方式二:CallNonvirtualVoidMethod
c 代码实现
extern "C"
JNIEXPORT jobject JNICALL
Java_com_example_myapplication_MainActivity_getUtil(JNIEnv *env, jobject thiz) {
jclass cls = env->FindClass("com/example/myapplication/Util");
//调用无参构造函数
jmethodID init = env->GetMethodID(cls, "<init>", "()V");
//分配对象实例
jobject util = env->AllocObject(cls);
//创建实例
env->CallNonvirtualVoidMethod(util,cls,init);
return util;
}
实战演练:调用有参构造函数
java 代码实现
public class Util {
String name = "";
int age = 0;
//这个方法 c 调用,创建对象
public Util(String name, int age) {
this.name = name;
this.age = age;
Log.d("util-", "init");
}
}
c 代码实现
extern "C"
JNIEXPORT jobject JNICALL
Java_com_example_myapplication_MainActivity_getUtil(JNIEnv *env, jobject thiz) {
jclass cls = env->FindClass("com/example/myapplication/Util");
//调用有参构造函数,两个参数,一个是 String, 一个是 Int
jmethodID init = env->GetMethodID(cls, "<init>", "(Ljava/lang/String;I)V");
jstring name = env->NewStringUTF("zhaoyanjun");
//创建实例
jobject util = env->NewObject(cls, init, name, 10);
return util;
}
函数调用:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val util = getUtil()
Log.d("util--", "${util.name} ${util.age}")
}
external fun getUtil(): Util
companion object {
// Used to load the 'native-lib' library on application startup.
init {
System.loadLibrary("native-lib")
}
}
}