2010-06-29 53 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); 

沒有測試和編譯,但是這就是我會做它:)

乾杯