2013-07-17 90 views
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什麼可能是這裏的問題...

+0

使用'gdb'調試你的C++代碼,以確保它確實是被JVM ... –

+0

事情是實際上是在方法內部創建了一些參數配置,而當執行在創建MyObject的地方斷線debuger顯示config是用參數創建的,所以該方法被定義爲 – Opsenas

+0

調用方式C++回到Java是非常難以調試的。我建議你讓Java傳遞一個C++對象來填充。 –

回答

0

它出現的第三方軟件正在對UI元素調用,那就是拋放的原因,不過,我不明白爲什麼沒有運行時錯誤...

解決方案代碼會是:

public void CreateObject() 
{ 
    runOnUiThread(new Runnable() 
    { 
     public void run() 
     { 
      HashMap<AdConfigKey, String> config = new HashMap<AdConfigKey, String>(); 
      config.put("my string1", "string1"); 
      config.put("my string2", "string2"); 
      config.put("my string3", "string3"); 

      MyObject = new MyObject(this, config); 
      MyObject.setListener(this); 
      MyObject.setLanguage(lang); 
     } 
    } 
}