Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JNI与返回多个大小未预先确定的短int指针的C函数一起使用_Java_Android_C_Java Native Interface - Fatal编程技术网

Java 将JNI与返回多个大小未预先确定的短int指针的C函数一起使用

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

我在Android应用程序中使用了一个C函数,它“返回”多个短(int)指针,以及每个指针通过参数列表指向的短int数。我想将所有这些列表返回给调用的Java类,因此不能对函数使用单一的返回类型。似乎我需要事先知道列表的大小,以便预先分配一个具有足够内存的java short[],如下所示:

java类内部

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模型