JNI访问Java成员变量
1.定义成员变量textStr
//1. 定义变量textStr
public String textStr ="hello ndk";
2.添加native方法accessField():
//2. 定义native 方法 accessField();
public native void accessField();
3.选中accessField,按 Alt+Enter快捷添加.cpp中方法Java_com_example_myapplication_MainActivity_accessField
//获取类
jclass jcla = env->GetObjectClass(instance);
//获取成员变量 textStr 得id
jfieldID jfield = env->GetFieldID(jcla, "textStr", "Ljava/lang/String;");
jstring changeText=env->NewStringUTF("hello word ndk");
//修改属性id 对应得值
env->SetObjectField(instance,jfield,changeText);
JNI访问Java静态变量
同上添加静态属性和 native方法:
public static String staticText="static str";
public native void accessStaticField();
按 Alt+Enter快捷添加.cpp中方法Java_com_amn_amn_ndk_102_MainActivity_accessStaticField
//1.获取类
jclass jcla=env->GetObjectClass(instance);
//2.获取静态变量id
jfieldID jfield=env->GetStaticFieldID(jcla,"staticText","Ljava/lang/String;");
//3.根据静态变量id 修改值
jstring textChange=env->NewStringUTF("staticText is changed");
env->SetStaticObjectField(jcla,jfield,textChange);
JNI访问Java非静态方法
同上添加Java非静态方法和 native方法:
public native String accessMethod();
public String getName(String name){
Log.e(TAG, "name = " + name);
return name;
}
.cpp文件
//1. 获取类
jclass jcla = env->GetObjectClass(instance);
//2.获取方法 getName id 第二个参数:方法名 第三个参数:(参数)返回值 的类型描述
jmethodID jmId = env->GetMethodID(jcla, "getName", "(Ljava/lang/String;)Ljava/lang/String;");
//3.调用方法
jstring jst = env->NewStringUTF("i am amn");
jobject jobRes = env->CallObjectMethod(instance, jmId, jst);
return static_cast<jstring >(jobRes);
JNI访问Java静态方法
添加静态方法和 native方法