由于有限的 android 应用程序内存堆,我尝试使用 malloc 和 memcpy 在 C 中通过缓存位图数组创建。
所以在java方面我有:
private static native Bitmap getJNIBitmap(int id);
private static native void setJNIBitmap(int id, Bitmap bmp);
将位图发送到 C:
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
setJNIBitmap(id, bmp);
从 C 中检索它:
Bitmap bitmap = getJNIBitmap(id);
在 C 代码中,我有一个数组,我想使用位图缓存:
jobject bitmap_array[100];
要在 CI 中保存位图,请使用:
JNIEXPORT void JNICALL Java_droid_demo_ReadingActivity_setJNIBitmap(JNIEnv* env, jobject obj, jint id, jobject jniBmp) {
AndroidBitmapInfo info;
AndroidBitmap_getInfo(env, jniBmp, &info);
long byteSize = (info.stride * info.height)+16;
bitmap_array[(int)id] = (jobject *)malloc(byteSize);
memcpy(bitmap_array[(int)id], jniBmp, byteSize);
(*env)->NewGlobalRef(env, bitmap_array[(int)id]);
}
从 C 中检索位图:
JNIEXPORT jobject JNICALL Java_droid_demo_ReadingActivity_getJNIBitmap(JNIEnv * env, jobject obj, jint id) {
jobject temp = bitmap_array[(int)id];
return temp;
}
一般来说,我很擅长使用 JNI 和 C,但在我看来,这应该可行。好吧,它没有,我收到:
10-05 10:35:54.890: W/dalvikvm(12493): JNI WARNING: 0x5d5e0008 is not a valid JNI reference
10-05 10:35:54.890: W/dalvikvm(12493): in Ldroid/demo/ReadingActivity;.setJNIBitmap:(ILandroid/graphics/Bitmap;)V (NewGlobalRef)
10-05 10:35:54.890: I/dalvikvm(12493): "main" prio=5 tid=1 RUNNABLE
10-05 10:35:54.890: I/dalvikvm(12493): | group="main" sCount=0 dsCount=0 obj=0x41611568 self=0x416019f8
10-05 10:35:54.890: I/dalvikvm(12493): | sysTid=12493 nice=0 sched=0/0 cgrp=apps handle=1074710320
10-05 10:35:54.890: I/dalvikvm(12493): | schedstat=( 7665497000 93442000 221 ) utm=418 stm=348 core=1
关于为什么我不能使 bitmap_array[(int)id] 成为全局参考的任何想法?甚至可能如何解决这个问题?