Android NDK 入门开发例子(一)
16lz
2021-01-23
ndk-jni中C/C++接口函数修改函数参数jobject对象成员值(数组)的问题
现java中有个类:
public class TestClass { private int nValue; private String strValue; private int[] nArr=new int[8]; public TestClass(int a, String b) { super(); this.nValue = a; this.strValue = b; for(int i=0;i<8;++i){ nArr[i] = 0; } } public TestClass() { super(); for(int i=0;i<8;++i){ nArr[i] = 0; } } public int getInt(){ return nValue; } public String getStr(){ return strValue; }}
调用方法:
//调用:TestClass testObj=new TestClass(33,"abc123");funTest(testObj);
在一个jni C函数接口中该类对象作为参数传入底层,底层C代码需要修改该对象的相关成员,对于int和String类型的成员都好办:
C/C++ code:
void Java_com_xxx_yyy_TestActivity_funTest(JNIEnv* env, jobject thiz,jobject obj){ jclass objClass = env->GetObjectClass(obj); if(objClass) { //获取相关数据; jfieldID intID = env->GetFieldID(objClass,"nValue","I"); jint nValue = (int)env->GetIntField(obj,intID); jfieldID strID = env->GetFieldID(objClass,"strValue","Ljava/lang/String;"); jstring jstr = (jstring)env->GetObjectField(obj,strID); const char *pszStr = env->GetStringUTFChars(jstr,NULL); env->ReleaseStringUTFChars(jstr,pszStr); //设置相关数据 jstring str = env->NewStringUTF("qweABC123xxXXXX"); env->SetObjectField(obj,strID,str); env->SetIntField(obj,intID,222); //如何设置nArr呢? }}
但是对于那个int[] nArr数组怎么弄啊,比如我要回写nArr的值为 1234567(nArr[0]=1,nArr[1]=2,nArr[2]=3…..)
现在 既可以在上边的 添加方法为:
jfieldID intArrID = env->GetFieldID(objClass,"nArr","[I");jint nArr[8] = {8,7,6,5,4,3,2,1};jintArray jnArray = env->NewIntArray(8);env->SetIntArrayRegion(jnArray,0,8,nArr);env->SetObjectField(obj,intArrID,jnArray);
既可以完成jni修改java层代码.
更多相关文章
- Android绘制文本对象FontMetrics介绍及繪製文本
- Android 中的 Looper 对象
- 关于Android/java的复杂对象的深拷贝和浅拷贝
- Android Audio代码分析13 - AudioTrack::getPosition函数
- android 使用Intent传递对象 Serializable 或者 Parcelabel 《第
- Android 中调试手段 打印函数调用栈信息
- Android 利用JNI调用Android Java代码函数