1、首先创建成员变量:showText
public String showText = "Hello World";
2、添加native
方法accessField()
public native void accessField();
选中accessField
,按 Alt+Enter
快捷添加.cpp
中方法Java_com_example_myapplication_MainActivity_accessField
3、在JNI方法中修改showText的值
extern "C"
JNIEXPORT void JNICALL
Java_com_hooyah_hellondk_MainActivity_accessField(JNIEnv *env, jobject thiz) {
// TODO: implement accessField()
//获取类
jclass jcla=env->GetObjectClass(thiz);
//获取类的成员变量showText的id
jfieldID jfied=env->GetFieldID(jcla,"showText","Ljava/lang/String;");
jstring showText=env->NewStringUTF("Hello NDK");
//修改属性id对应的值
env->SetObjectField(thiz,jfied,showText);
}
4、验证结果
public String showText = "Hello World";
TextView tv = findViewById(R.id.sample_text);
accessField();
tv.setText(showText);
1、添加静态属性和native方法
public static String staticShowText="Hello World";
public native void accessStaticField();
2、选中“accessStaticField”按住Alter+Enter会在cpp文件中自动生成对应的JNI方法
//修改java静态变量
extern "C"
JNIEXPORT void JNICALL
Java_com_hooyah_hellondk_MainActivity_accessStaticField(JNIEnv *env, jobject thiz) {
// TODO: implement accessStaticField()
//获取类
jclass oClass = env->GetObjectClass(thiz);
//获取静态变量id
jfieldID staticFid = env->GetStaticFieldID(oClass, "staticShowText", "Ljava/lang/String;");
//设置静态变量
jstring after = env->NewStringUTF("static field update in jni");
env->SetStaticObjectField(oClass, staticFid, after);
}
3、调用验证
TextView tv = findViewById(R.id.sample_text);
accessStaticField();
tv.setText(staticShowText);
1、添加Java
非静态方法和 native
方法
public native String accessMethodData();
public String getMethodData(String name) {
Log.e("MainActivity", "name = " + name);
return name;
}
2、在JNI方法中做如下更改
extern "C"
JNIEXPORT jstring JNICALL
Java_com_hooyah_hellondk_MainActivity_accessMethodData(JNIEnv *env, jobject thiz) {
// TODO: implement accessMethodData()
//获取类
jclass jCla = env->GetObjectClass(thiz);
//获取方法id 第二个参数:方法名 第三个参数:(参数)返回值 的类型描述
jmethodID methodID = env->GetMethodID(jCla, "getMethodData",
"(Ljava/lang/String;)Ljava/lang/String;");
jstring res = env->NewStringUTF("getMethodDataTest");
jobject objRes = env->CallObjectMethod(thiz, methodID, res);
return static_cast(objRes);
}
3、调用验证
TextView tv = findViewById(R.id.sample_text);
tv.setText(accessMethodData());
1、添加Java
静态方法和 native
方法:
private static int getRandomValue(int max) {
return new Random().nextInt(max);
}
public native int accessStaticMethod(int max);
2、在JNI方法中做如下更改
extern "C"
JNIEXPORT jint JNICALL
Java_com_hooyah_hellondk_MainActivity_accessStaticMethod(JNIEnv *env, jobject thiz, jint max) {
// TODO: implement accessStaticMethod()
//获取类
jclass jCla = env->GetObjectClass(thiz);
//获取静态方法的id
jmethodID methodID = env->GetStaticMethodID(jCla, "getRandomValue", "(I)I");
//调用静态方法
jint res = env->CallStaticIntMethod(jCla, methodID, max);
//返回结果
return res;
}
3、调用验证结果
TextView tv = findViewById(R.id.sample_text);
tv.setText(accessStaticMethod(100));
1、添加 native
方法:
public native Date accessConstructor();
2、在JNI方法中做如下更改
extern "C"
JNIEXPORT jobject JNICALL
Java_com_hooyah_hellondk_MainActivity_accessConstructor(JNIEnv *env, jobject thiz) {
// TODO: implement accessConstructor()
//得到TestClass对应的jclass
// jclass jCla = env->FindClass("com/example/myapplication/TestClass");
jclass jCla = env->FindClass("java/util/Date");
//获取构造函数的methodId 构造函数为 void函数 对应的方法名为
jmethodID methodID = env->GetMethodID(jCla, "", "()V");
jobject jTestClass = env->NewObject(jCla, methodID);
return jTestClass;
}
3、调用验证结果
TextView tv = findViewById(R.id.sample_text);
tv.setText(accessConstructor().toString());
参考文章:JNI访问Java变量和方法