从jni返回并填充jintArray 我试图从C++到java返回一个金标,但是不管我做什么,调用都保持挂起,代码就停止了。即使是像这样简单的事情 JNIEXPORT jintArray JNICALL Java_main_getIntArray(JNIEnv *env, jclass c) { jintArray intArray = env->NewIntArray(5); jint values[5] = {69, 69, 69, 69, 69}; env->SetIntArrayRegion(intArray, 0, 5, values); env->ReleaseIntArrayElements(intArray, values, NULL); return intArray; }
在java中,我正在做从jni返回并填充jintArray 我试图从C++到java返回一个金标,但是不管我做什么,调用都保持挂起,代码就停止了。即使是像这样简单的事情 JNIEXPORT jintArray JNICALL Java_main_getIntArray(JNIEnv *env, jclass c) { jintArray intArray = env->NewIntArray(5); jint values[5] = {69, 69, 69, 69, 69}; env->SetIntArrayRegion(intArray, 0, 5, values); env->ReleaseIntArrayElements(intArray, values, NULL); return intArray; },c++,arrays,java-native-interface,jint,C++,Arrays,Java Native Interface,Jint,在java中,我正在做 System.out.println("Start getting array"); System.out.println("Array: " + Arrays.toString(getIntArray())); System.out.println("Done getting array"); 但我得到的唯一结果是 开始获取数组 我做错什么了吗 我尝试从值[]创建指针,并在SetIntArrayRegion中使用该指针 我试图通过循环来填充数组 我试着移除释放装置
System.out.println("Start getting array");
System.out.println("Array: " + Arrays.toString(getIntArray()));
System.out.println("Done getting array");
但我得到的唯一结果是
开始获取数组
我做错什么了吗
- 我尝试从值[]创建指针,并在SetIntArrayRegion中使用该指针
- 我试图通过循环来填充数组
- 我试着移除释放装置
releaseintarayelements
不应该在那里,因为您没有调用GetIntArrayElements
。为了清楚起见,因为您的代码没有显示它:您的函数不知何故被包装在外部“C”
中?(我想是的,或者你应该得到一个unsatifiedlinkerror
或者类似的东西)@zenzelezz:是的,头文件被包装成一个外部“C”。即使没有先挂起应用程序的ReleaseIntArrayElements,也要检查是否调用了本机方法。开始注释它的所有主体,返回null。然后,一次取消一行内容的注释。也许,你可以添加一些PrTrF来检查在原生方法中发生的事情。当处理这类问题时,我经常在每个语句之后都会在C+C++代码中使用一个打印语句(如果使用CERP,如果C++,fPrtTf(STDRR)如果是C)。虽然不是很优雅,但它会精确地指出代码给您带来问题的那一行,您会很快得到答案。