网站建设QQ刷赞,企业目录,网站设计收费模式,重庆seo整站优化在JNI中#xff0c;本地代码#xff08;C/C#xff09;中修改了Java对象的变量#xff0c;并且将其传递回Java端#xff0c;那么Java端会看到变量的修改#xff0c;尝试以下两种方式进行修改#xff1a; 添加native方法 data class MyData(var key:Int,var value:String…在JNI中本地代码C/C中修改了Java对象的变量并且将其传递回Java端那么Java端会看到变量的修改尝试以下两种方式进行修改 添加native方法 data class MyData(var key:Int,var value:String
)class TestLib {companion object{init {System.loadLibrary(jnitest)}}external fun modifyData(data:Int)external fun modifyMyData(data:MyData)
}var data 1
Log.i(TAG,in ${data})
testLib.modifyData(1)
Log.i(TAG,out ${data})
var myData MyData(1,Hello)
Log.i(TAG,mydata in ${myData.toString()})
testLib.modifyMyData(myData)
Log.i(TAG,mydata in ${myData.toString()})C extern CJNIEXPORT void JNICALLJava_com_test_jnitest_TestLib_modifyData(JNIEnv *env, jobject thiz, jint data) {data 2;}extern CJNIEXPORT void JNICALLJava_com_test_jnitest_TestLib_modifyMyData(JNIEnv *env, jobject thiz, jobject data) {jclass cls env-GetObjectClass(data);jfieldID fieldKey env-GetFieldID(cls, key, I);// 获取变量的值jint valueKey env-GetIntField(data, fieldKey);// 修改变量的值valueKey 2;// 设置变量的新值env-SetIntField(data, fieldKey, valueKey);jfieldID fieldValue env-GetFieldID(cls, value, Ljava/lang/String;);// 创建一个新的字符串const char *newStr World;jstring newString env-NewStringUTF(newStr);// 设置实体类的String变量env-SetObjectField(data, fieldValue, newString);}日志打印 I/MainActivity: in 1I/MainActivity: out 1I/MainActivity: mydata in MyData(key1, valueHello)I/MainActivity: mydata in MyData(key2, valueWorld)第一种方法虽然在JNI中将变量修改为2但是在Java端仍然保持为1这是因为在JNI中传递的是变量的值的副本而不是引用。要在JNI中更改Java对象的变量需要通过第二种传递对象的引用来实现使用JNI函数获取和设置变量的值成功地更改Java对象的变量。