Java JNI使用android5+;

Java JNI使用android5+;,java,android,java-native-interface,native,Java,Android,Java Native Interface,Native,我使用此本机代码来获取一组短裤:) extern“C” JNIEXPORT jshortArray Java_my_应用程序_CallerLazz_getShortArray(JNIEnv*jenv,jobject self) { jshortArray shortArray=jenv->NewShortArray(大小); jshort*p2ji=jenv->GetShortArrayElements(shortArray,JNI_FALSE); 对于(int-idx=0;idx在从C++函数

我使用此本机代码来获取一组短裤:)

extern“C”
JNIEXPORT jshortArray Java_my_应用程序_CallerLazz_getShortArray(JNIEnv*jenv,jobject self)
{
jshortArray shortArray=jenv->NewShortArray(大小);
jshort*p2ji=jenv->GetShortArrayElements(shortArray,JNI_FALSE);
对于(int-idx=0;idx
它适用于所有小于5的Android版本。由于Android 5,本机代码本身工作正常,但是java端的
short[]
只填充了
0

有人知道为什么会发生这种情况吗?

引用for
GetArrayElements()

由于返回的数组可能是Java数组的副本,因此在调用
ReleaseArrayElements()
之前,对返回数组所做的更改不一定会反映在原始数组中


<> P>在从C++函数返回之前,你应该调用<代码> RelaseHORTARRAYEngs<代码> >代码> MODE=0 (<代码> 0 < /COD> >意味着“复制内容,释放ELSM缓冲区”)。实际上我是用
SetShortArrayRegion
做的。但是技术上和我读到的一样。等等,你是说你使用了
setShortarray区域
而不是
relaseShortarray元素
?您应该总是在Get之后调用Release,因为如果Get创建了一个副本,那么它需要被释放,由哪个版本负责。如果没有复制,对象可能会被固定,直到调用Release,这将使压缩垃圾收集器很难优化堆。很抱歉,这是
GetShortArrayRegion
。在这里找到一些提示
extern "C" 
JNIEXPORT jshortArray Java_my_application_CallerClazz_getShortArray(JNIEnv *jenv, jobject self)
{
    jshortArray shortArray = jenv->NewShortArray(size);
    jshort* p2ji = jenv->GetShortArrayElements(shortArray, JNI_FALSE);
    for(int idx = 0; idx < size; idx++)
    {
        p2ji[idx] = srcArray[idx];
    }
    return shortArray;
}