Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.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 GetShortArrayElements与SIGSEGV SEGV_ACCERR一起失败_Java_Android_C++_Java Native Interface_Kotlin - Fatal编程技术网

Java JNI GetShortArrayElements与SIGSEGV SEGV_ACCERR一起失败

Java JNI GetShortArrayElements与SIGSEGV SEGV_ACCERR一起失败,java,android,c++,java-native-interface,kotlin,Java,Android,C++,Java Native Interface,Kotlin,我在托管代码中创建了一个缓冲区: var nativeBuffer = ShortArray(bufferSize) 这是Kotlin代码,但根据,此语法实际上是一个返回short[]的包装器 我想用C++编写这个缓冲区,使用JNI:< /P> JNIEXPORT void JNICALL Java_package_class_name_readNext (JNIEnv * env, jclass clazz, jshortArray javaArray) { jboolean

我在托管代码中创建了一个缓冲区:

var nativeBuffer = ShortArray(bufferSize)
这是Kotlin代码,但根据,此语法实际上是一个返回
short[]
的包装器

我想用C++编写这个缓冲区,使用JNI:< /P>

JNIEXPORT void JNICALL Java_package_class_name_readNext
    (JNIEnv * env, jclass clazz, jshortArray javaArray)
{
    jboolean * isCopy;
    short * targetArray = env->GetShortArrayElements(javaArray, isCopy);

    // Do stuff to targetArray
}
问题是,
GetShortArrayElements
调用总是导致崩溃,出现以下情况:

11-07 21:23:53.610 86-86/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-07 21:23:53.610 86-86/? I/DEBUG: Build fingerprint: 'generic/vbox86p/vbox86p:5.1/LMY47D/buildbot06092001:userdebug/test-keys'
11-07 21:23:53.610 86-86/? I/DEBUG: Revision: '0'
11-07 21:23:53.610 86-86/? I/DEBUG: ABI: 'x86'
11-07 21:23:53.610 86-86/? I/DEBUG: pid: 28339, tid: 28477, name: Thread-282  >>> <package-name> <<<
11-07 21:23:53.610 86-86/? I/DEBUG: signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xb3bcfacb
11-07 21:23:53.613 86-86/? I/DEBUG:     eax b3bcfacb  ebx b3ffcaa4  ecx a2497000  edx b426e480
11-07 21:23:53.613 86-86/? I/DEBUG:     esi a2497000  edi b3fff440
11-07 21:23:53.613 86-86/? I/DEBUG:     xcs 00000073  xds 0000007b  xes 0000007b  xfs 000000e7  xss 0000007b
11-07 21:23:53.613 86-86/? I/DEBUG:     eip b3dcd69c  ebp 9f5a2968  esp 9f5a2880  flags 00210282
11-07 21:23:53.613 86-86/? I/DEBUG:     #00 pc 002e069c  /system/lib/libart.so (short* art::JNI::GetPrimitiveArray<_jshortArray*, short, art::mirror::PrimitiveArray<short> >(_JNIEnv*, _jshortArray*, unsigned char*)+572)
11-07 21:23:53.613 86-86/? I/DEBUG:     #01 pc 0010cdad  /system/lib/libart.so (art::CheckJNI::GetShortArrayElements(_JNIEnv*, _jshortArray*, unsigned char*)+125)
11-07 21:23:53.610 86-86/?I/DEBUG:*********************************************************
11-07 21:23:53.610 86-86/? I/DEBUG:Build指纹:“generic/vbox86p/vbox86p:5.1/LMY47D/buildbot06092001:userdebug/testkey”
11-07 21:23:53.610 86-86/? I/DEBUG:修订版:“0”
11-07 21:23:53.610 86-86/? I/DEBUG:ABI:'x86'

11-07 21:23:53.610 86-86/? I/DEBUG:pid:28339,tid:28477,name:Thread-282>>Oops,您没有正确使用
isCopy
参数。应该是:

jboolean isCopy;
jshort* targetArray = env->GetShortArrayElements(javaArray, &isCopy);
也就是说,
isCopy
是一个“out参数”(使用C#lingo)

如果您不关心
targetArray
是否别名为
javaArray
,也可以传递
nullptr
,如下所示:

jshort* targetArray = env->GetShortArrayElements(javaArray, nullptr);

哎呀,您没有正确使用
isCopy
参数。应该是:

jboolean isCopy;
jshort* targetArray = env->GetShortArrayElements(javaArray, &isCopy);
也就是说,
isCopy
是一个“out参数”(使用C#lingo)

如果您不关心
targetArray
是否别名为
javaArray
,也可以传递
nullptr
,如下所示:

jshort* targetArray = env->GetShortArrayElements(javaArray, nullptr);

目标数组应该是jshort而不是short

您还需要使用&而不是通过值通过引用传递isCopy

更多信息请点击此处:
目标数组应该是jshort而不是short

您还需要使用&而不是通过值通过引用传递isCopy

更多信息请点击此处: