举例说明JNI如何通过java class参数修改该类中数组类型的成员变量,如下所示array为Test类的一个成员变量,类型是double数组。
public class Test {
double []array;
Test() {
array = new double[10];
}
}
调用JNI接口对应如下,参数是Test类的一个实例:
public native void setTestArray(Test test);
对应的JNI代码如下:
extern "C"
JNIEXPORT void JNICALL
FUNCTION(setTestArray(JNIEnv *env, jobject instance, jobject test)) {
//获取class
jclass objClass = env->GetObjectClass(test);
//获取array的fieldID
jfieldID arrayID = env->GetFieldID(objClass, "array", "[D");
//通过fieldID获取数组地址
jdoubleArray array = (jdoubleArray)env->GetObjectField(test, arrayID);
//构建长度为len的数组
jsize len = env->GetArrayLength(array);
double *buffer =new double[len];
for(int i=0; i<len; ++i){
buffer[i] = i;
}
//给Test类的array数组赋值
jsize start =0;
env->SetDoubleArrayRegion(array,start,len,buffer);
delete[] buffer;
}