2013-03-11 94 views
5

我想通過Android上的C++/JNI調用Java類。更具體地說,我試圖調用這個類的構造函數,它將Android Context作爲參數。如果我的構造函數沒有參數,我沒有任何問題,但是當我將必要的Context作爲參數包含在內時,我不知道我的JNI簽名應該是什麼樣子,並且懷疑這是否可能,因爲我沒有訪問該上下文對象。如何從C++/JNI中調用需要Android上下文參數的Java方法

所以,我的問題是,是否可以調用一個Java類的構造函數,它將Android Context作爲其唯一參數?如果是這樣,怎麼樣? 如果沒有,是否有解決方法,因爲我需要上下文來訪問某些Android API類。

+0

這是否有幫助[使用C++與Android ndk/jni](http://stackoverflow.com/questions/6423078/use-c-with-android-ndk-jni)? – static 2013-03-11 01:24:32

回答

2

我不相信它可能以你陳述的方式。然而,無論知道你的類的結構,你總是可以創建它作爲一個單獨的靜態實例,在你的Activity啓動時被實例化,從而該類在當時達到所需的上下文。它基本上會坐在那裏,直到你準備從C++調用,但確實可以用來處理你的請求/上下文。

+0

謝謝!完美地工作! – 2013-03-12 00:24:55

0

獲取構造函數的方法ID時,只需指定想要的方法ID即可。目前,你可能做這樣的事情:

​​

相反,你想用GetMethodID時指定參數的類型,並通過它調用NewObject時英寸

constructor = (*env)->GetMethodID(env, cls, "<init>", "(Landroid/content/Context;)V"); 
object = (*env)->NewObject(env, cls, constructor, context); 
+0

謝謝,但提供的語法...任何想法,如果有可能實現的上下文沒有Java方法首先傳遞它? – 2013-03-11 16:13:52

+0

您應該從Java中傳入一個,就像在Java類中一樣。雖然可能的話,如果你很聰明,找到應用程序上下文,這不是好的設計(並且除其他外,會讓你的類更少測試)。 – 2013-03-11 16:18:23