c - 将大型数组从 java 传递到 c 时出现 jni 错误

标签 c arrays android-ndk java-native-interface native

我知道有人问过这个问题,但我的情况是 3D 数组,我没有设法应用这里给出的解决方案:Android passing large float arrays from native to java via jni. Getting error if over certain size

我面临着类似的问题,我可以传递小数组但不能传递大数组。我在 logcat 上收到 unpinedprimitivearray 错误。

这是我的 C 代码:

#include <jni.h>
#include <stdio.h>
#include<stddef.h>


JNIEXPORT jdouble JNICALL Java_com_example_invert_MainActivity_inv
  (JNIEnv *env, jobject obj, jobjectArray arr){
    double sum = 0;
    int i,j,k;

     jsize dim1 = (*env)->GetArrayLength(env, arr);

       for (i=0; i<dim1; i++){

            jdoubleArray *line1 =   (*env)->GetObjectArrayElement(env, arr, i);
            int dim2 =       (*env)->GetArrayLength(env, line1);
            jdouble *pos1 = (*env)->GetDoubleArrayElements(env, line1, 0);

            for (j=0; j<dim2; j++){
                jdoubleArray *line2 =   (*env)->GetObjectArrayElement(env, line1, j);
                int dim3 =       (*env)->GetArrayLength(env, line2);
                jdouble *pos2 = (*env)->GetDoubleArrayElements(env, line2, 0);

                for (k=0; k<dim3; k++){
                                   sum += pos2[k];
                    }
                (*env)->ReleaseDoubleArrayElements(env, arr, pos2, 0);
                (*env)->ReleaseDoubleArrayElements(env, arr, line2, 0);
              }

            (*env)->ReleaseDoubleArrayElements(env, arr, pos1, 0);

            (*env)->ReleaseDoubleArrayElements(env, arr, line1, 0);
       }



    return sum;

}

以及完整的 Logcat 输出:

02-20 18:35:42.784: W/dalvikvm(9385): VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;)
02-20 18:35:42.784: I/dalvikvm(9385): Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onSearchRequested
02-20 18:35:42.784: W/dalvikvm(9385): VFY: unable to resolve interface method 14481: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z
02-20 18:35:42.784: D/dalvikvm(9385): VFY: replacing opcode 0x72 at 0x0002
02-20 18:35:42.784: I/dalvikvm(9385): Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onWindowStartingActionMode
02-20 18:35:42.784: W/dalvikvm(9385): VFY: unable to resolve interface method 14485: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
02-20 18:35:42.784: D/dalvikvm(9385): VFY: replacing opcode 0x72 at 0x0002
02-20 18:35:42.914: I/dalvikvm(9385): Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
02-20 18:35:42.914: W/dalvikvm(9385): VFY: unable to resolve virtual method 406: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
02-20 18:35:42.914: D/dalvikvm(9385): VFY: replacing opcode 0x6e at 0x0002
02-20 18:35:42.914: I/dalvikvm(9385): Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
02-20 18:35:42.914: W/dalvikvm(9385): VFY: unable to resolve virtual method 428: Landroid/content/res/TypedArray;.getType (I)I
02-20 18:35:42.914: D/dalvikvm(9385): VFY: replacing opcode 0x6e at 0x0002
02-20 18:35:43.264: D/libEGL(9385): loaded /vendor/lib/egl/libEGL_adreno.so
02-20 18:35:43.284: D/libEGL(9385): loaded /vendor/lib/egl/libGLESv1_CM_adreno.so
02-20 18:35:43.294: D/libEGL(9385): loaded /vendor/lib/egl/libGLESv2_adreno.so
02-20 18:35:43.304: I/Adreno-EGL(9385): <qeglDrvAPI_eglInitialize:316>: EGL 1.4 QUALCOMM build: LNXBUILD_AU_LINUX_ANDROID_JB_3.2.4.04.03.00.173.012+PATCH[ES]_msm8226_JB_3.2.4__release_ENGG ()
02-20 18:35:43.304: I/Adreno-EGL(9385): OpenGL ES Shader Compiler Version: 20.00.01
02-20 18:35:43.304: I/Adreno-EGL(9385): Build Date: 02/27/14 Thu
02-20 18:35:43.304: I/Adreno-EGL(9385): Local Branch: 
02-20 18:35:43.304: I/Adreno-EGL(9385): Remote Branch: quic/jb_3.2.4
02-20 18:35:43.304: I/Adreno-EGL(9385): Local Patches: 7de55685a2714b78da20f2a126b0dd72b0d2c0c4 Merge "PROFILER: fix default enabled/disabled setting"
02-20 18:35:43.304: I/Adreno-EGL(9385):                  75d04ab84c7a68c72d92d59aae1827fcfef44b91 PROFILER: fix default enabled/disabled setting
02-20 18:35:43.304: I/Adreno-EGL(9385): Reconstruct Branch: LOCAL_PATCH[ES]
02-20 18:35:43.414: D/OpenGLRenderer(9385): Enabling debug mode 0
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.224: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.234: W/dalvikvm(9385): JNI: unpinPrimitiveArray(0x42514190) failed to find entry (valid=1)
02-20 18:35:44.244: E/dalvikvm(9385): JNI ERROR (app bug): local reference table overflow (max=512)
02-20 18:35:44.244: W/dalvikvm(9385): JNI local reference table (0x603c5f78) dump:
02-20 18:35:44.244: W/dalvikvm(9385):   Last 10 entries (of 512):
02-20 18:35:44.244: W/dalvikvm(9385):       511: 0x42519650 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       510: 0x42519628 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       509: 0x42519600 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       508: 0x425195d8 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       507: 0x425195b0 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       506: 0x42519588 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       505: 0x42519560 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       504: 0x42519538 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       503: 0x42519510 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):       502: 0x425194e8 double[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):   Summary:
02-20 18:35:44.244: W/dalvikvm(9385):         4 of java.lang.Class (4 unique instances)
02-20 18:35:44.244: W/dalvikvm(9385):         2 of java.lang.String (2 unique instances)
02-20 18:35:44.244: W/dalvikvm(9385):       480 of double[] (2 elements) (480 unique instances)
02-20 18:35:44.244: W/dalvikvm(9385):         1 of java.lang.String[] (2 elements)
02-20 18:35:44.244: W/dalvikvm(9385):         1 of com.example.invert.MainActivity
02-20 18:35:44.244: W/dalvikvm(9385):        23 of double[][] (21 elements) (23 unique instances)
02-20 18:35:44.244: W/dalvikvm(9385):         1 of double[][][] (30 elements)
02-20 18:35:44.244: E/dalvikvm(9385): Failed adding to JNI local ref table (has 512 entries)
02-20 18:35:44.244: I/dalvikvm(9385): "main" prio=5 tid=1 RUNNABLE
02-20 18:35:44.244: I/dalvikvm(9385):   | group="main" sCount=0 dsCount=0 obj=0x41801710 self=0x417ec980
02-20 18:35:44.244: I/dalvikvm(9385):   | sysTid=9385 nice=0 sched=0/0 cgrp=apps handle=1074262012
02-20 18:35:44.244: I/dalvikvm(9385):   | state=R schedstat=( 0 0 0 ) utm=37 stm=11 core=3
02-20 18:35:44.244: I/dalvikvm(9385):   at com.example.invert.MainActivity.inv(Native Method)
02-20 18:35:44.244: I/dalvikvm(9385):   at com.example.invert.MainActivity$1.onClick(MainActivity.java:71)
02-20 18:35:44.244: I/dalvikvm(9385):   at android.view.View.performClick(View.java:4476)
02-20 18:35:44.244: I/dalvikvm(9385):   at android.view.View$PerformClick.run(View.java:18795)
02-20 18:35:44.244: I/dalvikvm(9385):   at android.os.Handler.handleCallback(Handler.java:730)
02-20 18:35:44.244: I/dalvikvm(9385):   at android.os.Handler.dispatchMessage(Handler.java:92)
02-20 18:35:44.244: I/dalvikvm(9385):   at android.os.Looper.loop(Looper.java:176)
02-20 18:35:44.244: I/dalvikvm(9385):   at android.app.ActivityThread.main(ActivityThread.java:5493)
02-20 18:35:44.244: I/dalvikvm(9385):   at java.lang.reflect.Method.invokeNative(Native Method)
02-20 18:35:44.244: I/dalvikvm(9385):   at java.lang.reflect.Method.invoke(Method.java:525)
02-20 18:35:44.244: I/dalvikvm(9385):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225)
02-20 18:35:44.244: I/dalvikvm(9385):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041)
02-20 18:35:44.244: I/dalvikvm(9385):   at dalvik.system.NativeStart.main(Native Method)
02-20 18:35:44.244: E/dalvikvm(9385): VM aborting
02-20 18:35:44.244: A/libc(9385): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 9385 (.example.invert)

能否请您更正我的代码以处理大型数组?等待您的帮助。

最佳答案

发生的事情是您正在创建大量本地引用并且无法删除它们。最终表会填满,VM 会中止。

查看失败的摘要部分,有 480 个 double[] 实例和 23 个 double[][] 实例,所以这就是您需要的看看。

unpinPrimitiveArray 消息表明您正在尝试删除本地引用,但没有成功,因为找不到您传入的值。查看您的代码,您似乎将相同的数组引用 (arr) 传递到每个发布调用中,这是不正确的。您应该传递固定的数组对象和相应的原始数组指针。此外,在某些情况下,您调用了错误的发布函数。

例如,这个:

jdoubleArray *line2 =   (*env)->GetObjectArrayElement(env, line1, j);
int dim3 =       (*env)->GetArrayLength(env, line2);
jdouble *pos2 = (*env)->GetDoubleArrayElements(env, line2, 0);
...
(*env)->ReleaseDoubleArrayElements(env, arr, pos2, 0);
(*env)->ReleaseDoubleArrayElements(env, arr, line2, 0);

应该是:

(*env)->ReleaseDoubleArrayElements(env, line2, pos2, 0);
(*env)->DeleteLocalRef(env, line2);

pos2 来自 line2,因此这些值需要传递给相同的发布调用。 line2 引用是一个 jobject,而不是原始数组,因此应该使用 DeleteLocalRef 调用。

您需要对 pos1/line1 进行类似的修复。

另见 JNI Tips页面。

关于c - 将大型数组从 java 传递到 c 时出现 jni 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35526521/

相关文章:

c - `#include "FILE.h"` 是否让 gcc 在当前目录或其他地方搜索 FILE.h?

c++ - 适用于 Android 的 uSTL 或 STLPort?

android - Android OpenCV手势识别

python - 打印 numpy 数组中所有列都满足特定条件的行?

android - 如何将 Mat 数组从 JNI 返回到 Java

c - 调试指针算法

C 中的字符比较

c - 当我们在c中使用fork时,进程之间是否共享数据?

c++ - 具有连续内存的结构中的动态数组?

PHP array_push 一个数组到另一个数组