0
我有一個工程在C++上工作,現在使用JNI移植它以使用Java,所有計算仍然大部分是用C++編寫的,但現在它被Java包裝了,有一個Java對象,我需要創建,但它依賴於一些計算,因爲我在C++中做這些計算,我決定在C++完成這些計算後創建該對象。當我從C++調用JNI時,Java方法被拋棄了
JNI工作正常,因爲之前有多個調用,工作正常並且斷點工作(Java方法從本地調用)。
的Java是由C++
C++調用:
//after computations, C++ calls this method to call Java
extern "C"
{
void CreateObject()
{
JNIEnv *jenv = GetJavaEnv();
static jmethodID jmethod = GetJavaMethod(l_this, jenv, "CreateObject", "()V");
jenv->CallVoidMethod(l_this,jmethod)
}
}
的Java
public class MainActivity
{
private MyObject myObject = null;
//lang and config are set from native by other calls, when i enter Create object,
//they look fine
private String lang = null;
public void CreateObject()
{
HashMap<AdConfigKey, String> config = new HashMap<AdConfigKey, String>();
config.put("my string1", "string1");
config.put("my string2", "string2");
config.put("my string3", "string3");
//at this point config looks fine, it's created and parameters are inside...
MyObject = new MyObject(this, config);
MyObject.setListener(this);
MyObject.setLanguage(lang);
}
}
的事情是,在Java中調用執行,參數都很好,但在分配或構造函數調用永遠不會發生,該應用程序不會拋出任何異常或錯誤,執行繼續,但該對象從來沒有創建,請sugest什麼可能是這裏的問題...
使用'gdb'調試你的C++代碼,以確保它確實是被JVM ... –
事情是實際上是在方法內部創建了一些參數配置,而當執行在創建MyObject的地方斷線debuger顯示config是用參數創建的,所以該方法被定義爲 – Opsenas
調用方式C++回到Java是非常難以調試的。我建議你讓Java傳遞一個C++對象來填充。 –