Java 将JNI与返回多个大小未预先确定的短int指针的C函数一起使用
我在Android应用程序中使用了一个C函数,它“返回”多个短(int)指针,以及每个指针通过参数列表指向的短int数。我想将所有这些列表返回给调用的Java类,因此不能对函数使用单一的返回类型。似乎我需要事先知道列表的大小,以便预先分配一个具有足够内存的java short[],如下所示: java类内部Java 将JNI与返回多个大小未预先确定的短int指针的C函数一起使用,java,android,c,java-native-interface,Java,Android,C,Java Native Interface,我在Android应用程序中使用了一个C函数,它“返回”多个短(int)指针,以及每个指针通过参数列表指向的短int数。我想将所有这些列表返回给调用的Java类,因此不能对函数使用单一的返回类型。似乎我需要事先知道列表的大小,以便预先分配一个具有足够内存的java short[],如下所示: java类内部 short[] fooArr = new short[2]; short[] mooArr = FibLib.testFunc(fooArr); 内部c文件 JNIEXPORT jshor
short[] fooArr = new short[2];
short[] mooArr = FibLib.testFunc(fooArr);
内部c文件
JNIEXPORT jshortArray JNICALL Java_com_funTest_testFunc(JNIEnv *env, jclass clazz, jshortArray retData) {
// retData is the data returned to the caller via the parameter list
// it is declared in the java section and a pointer is created here
jshort outCArray[] = {100, 200}; // some fake data; in reality the size of this list is unknown until runtime
jshort *cArray = (*env)->GetShortArrayElements(env, retData, NULL);
if (cArray == NULL)
{
return 0;
}
else
{
//jini len = (*env)->GetArrayLength(env, array);
jsize len = (*env)->GetArrayLength(env, retData);
jint ix;
for (ix = 0; ix < len; ix++) {
cArray[ix] = outCArray[ix]; // this will modify retData with the new values when we release
}
(*env)->ReleaseShortArrayElements(env, retData, cArray, 0); // mode 0 to copy back the content and free cArray
}
jshortArray outJNIArray = (*env)->NewShortArray(env, 2); // allocate
//if (NULL == outJNIArray) return -1;
(*env)->SetShortArrayRegion(env, outJNIArray, 0 , 2, outCArray); // copy
return outJNIArray;
}
JNIEXPORT jshortArray JNICALL Java_com_funTest_testFunc(JNIEnv*env、jclass clazz、jshortArray retData){
//retData是通过参数列表返回给调用者的数据
//它在java部分声明,并在此处创建指针
jshort outCArray[]={100200};//一些虚假数据;实际上,在运行时之前,此列表的大小是未知的
jshort*cArray=(*env)->GetShortArrayElements(env,retData,NULL);
如果(cArray==NULL)
{
返回0;
}
其他的
{
//jini len=(*env)->GetArrayLength(env,数组);
jsize len=(*env)->GetArrayLength(env,retData);
金特九号;
对于(ix=0;ixReleaseShortArrayElements(env,retData,cArray,0);//模式0复制内容并释放cArray
}
jshortaray outJNIArray=(*env)->newshortaray(env,2);//分配
//if(NULL==outJNIArray)返回-1;
(*env)->setShortarray区域(env,outJNIArray,0,2,outCArray);//复制
返回输出射线;
}
如果我事先不知道retData的大小,如何将“可调整大小”的fooArr传递给testFunc
因此不能对函数使用单一的返回类型
为什么不呢?使用JNI的关键是以自然的方式定义Java模型(类和公共成员)。一些公共成员可以被设置为本地成员并在JNI中实现,但是创建私有本地方法和助手方法通常更容易,因此JNI编码对于C来说更干净、更自然
如果将com.funTest.testFunc
作为一个工厂方法,创建自身的实例,将一些实例字段添加到类中以获得结果,然后在JNI中创建一个实例并填充其字段
或者,如果您想要一个单独的结果类,请定义一个并在JNI端创建它并返回它
这完全取决于最有效的Java模型