我知道有人问过这个问题,但我的情况是 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/