1

由于有限的 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] 成为全局参考的任何想法?甚至可能如何解决这个问题?

4

2 回答 2

2

jobject 只是看起来像一个 C 指针。实际上,它是 Java 虚拟机内部某些信息的不透明句柄。可以将像素数据从 Java 位图对象复制到本机 C 数组,但只能通过特殊的 API。也可以使用 JNI 函数从本机 C 代码创建 Java 对象,但两者都不能简单地转换。

于 2012-10-05T10:29:57.010 回答
-1

试图从一开始就不是 Java 引用的东西中创建一个全局引用甚至没有任何意义。您没有对 NewGlobalRef() 的结果做任何事情,这使得调用它毫无意义,但是如果您想从 jniBmp 中进行全局引用,请将其传递给 NewGlobalRef() 并将结果存储在您的数组中。并且复制 jobject 的内容并不会首先复制位图数据。

于 2012-10-06T01:11:43.077 回答