2010-06-29 83 views
2

我已经看到了一些关于如何使用JNI将C数组正确传递到Java的问题,但我有相反的问题: 如何在C中使用JNI正确调用int数组的getter方法。具体来说,我想将一个BufferedImage实例传递给C,并在这个BufferedImage实例上调用“public int [] getRGB()”方法。在JNI中获取一个int数组

我的理解是,所有的数组在Java对象,所以我相信,我应该叫: (* ENV) - > CallObjectMethod() 为了得到这个数组,但是当我尝试这一点,我的JVM崩溃。有什么建议么?

回答

1

如果您从C++内部调用,env指针可能无效。您必须手动绑定JVM实例。喜欢的东西在C以下:

JNIEnv *env; 
(*g_vm)->AttachCurrentThread (g_vm, (void **) &env, NULL); 

你g_vm指针应该来自DLL中的JNI设置函数调用,你需要将其存储供以后使用。

+0

感谢您的建议。我认为你只需要附加当前线程,如果你从C调用JVM(尽管这不是100%)。我用普通的Java类启动JVM。 无论如何,我想我已经通过在我的类中创建一个辅助方法来解决这个问题,以使访问BufferedImage中的rgb值更简单。 – marcus 2010-06-29 20:12:44

+0

酷,不用担心:) – 2010-06-29 20:58:32

1

只是为了记录,我认为你所做的是正确的。下面的代码会做我想(我不知道你所谓的究竟是什么,因为你没有提供的代码)的伎俩:

jobject jBufferedImage = ...; 
... 
jclass clazz = (*env)->FindClass("java/awt/Image/BufferedImage"); 
jmethodID jMID = (*env)->GetMethodID(clazz, "getRGB", "()[I"); 
jintArray rgbValues = (jintArray) (*env)->CallObjectMethod(jBufferedImageObject, jMID); 

没有测试和编译,但是这就是我会做它:)

干杯