2011-04-25 25 views
0

希望周圍有更多有知識的人,在這裏我就去。在試圖調用由C幾乎成功的Java實例的方法,但在veery體弱地上......安卓上JNI的問題--Java實例方法

問題#1 - 調用到Java方法比如這個:

public void publishResult(String fromV8) 
{ 
    try 
    { 
     //final String backupBuffer = "tututu"; 
     final String backupBuffer = String.valueOf(fromV8); 
     runOnUiThread(new Runnable() { 

      @Override 
      public void run() 
      { 
       ((TextView)findViewById(46)).setText(backupBuffer); 
      } 
     }); 
    } catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

作品,但當我嘗試用「fromV8」參數做任何事情的JVM終止這個錯誤訊息在logcat中:

04-26 00:16:10.714: INFO/DEBUG(14398): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
04-26 00:16:10.714: INFO/DEBUG(14398): Build fingerprint: 'LGE/thunderg/thunderg/thunderg:2.2/FRF91/eng.swapan.pati.20101012.153426:user/release-keys' 
04-26 00:16:10.714: INFO/DEBUG(14398): >>> com.example.hellojni <<< 
04-26 00:16:10.714: INFO/DEBUG(14398): signal 11 (SIGSEGV), fault addr 6c6c65bc 
04-26 00:16:10.714: INFO/DEBUG(14398): r0 00000001 r1 00000001 r2 42f8bf90 r3 0022e1a8 

      [......plenty of registries and stack hexdump.....stripped] 

04-26 00:16:10.814: INFO/DEBUG(14398):  46b5ed04 aca508fb /system/lib/libdvm.so 
04-26 00:16:11.124: INFO/ActivityManager(1363): Process com.example.hellojni (pid 16632) has died. 
04-26 00:16:11.134: INFO/WindowManager(1363): WIN DEATH: Window{452be390 com.example.hellojni/com.example.hellojni.HelloJni paused=false} 
04-26 00:16:11.134: INFO/WindowManager(1363): Setting rotation to 0, animFlags=1 
04-26 00:16:11.144: INFO/BootReceiver(1363): Copying /data/tombstones/tombstone_09 to DropBox (SYSTEM_TOMBSTONE) 
04-26 00:16:11.154: INFO/ActivityManager(1363): Config changed: { scale=1.0 imsi=226/5 

loc=en_GB touch=3 keys=1/1/2 nav=1/1 orien=1 layout=18 uiMode=17 seq=65} 

和解決問題#2 - 即使我不跟參數什麼,但設定Java方法內的斷點JVM將再次中止。結果又是logcat的,它類似於一個以上,但有一些額外的兩行:

04-26 00:26:29.821: WARN/dalvikvm(16864): JDWP: slot 4 expected to hold object, 0x22e7b0 invalid 
04-26 00:26:29.821: ERROR/dalvikvm(16864): VM aborting 
[...+ SAME AS ABOVE...] 

在任何時間在控制檯有顯示了任何異常痕跡。這些常見症狀還是什麼?

謝謝!

回答

0

SIGSEGV在故障地址6c6c65bc指示無效的內存引用或段故障(SIGSEGV)。
對於來自本機代碼的異常,您必須在C/C++端明確調用方法ExceptionDescribe()。更多的細節你可以在這裏找到Exceptions

2

我以前見過這個問題,當我懶惰的對象參數從C/C++傳遞到Java(對於我來說bugbear似乎是字符串)。

env->CallStaticVoidMethod(interfaceClass, sendaString2Java, "Send me to Java"); 

編譯得很好,但引發運行時錯誤:

11-26 13:08:54.770: W/dalvikvm(1818): JDWP: slot 1 expected to hold object, 0xbea7a38c invalid 

如果你讓你想返回之前傳回一個「Java對象」的對象 - 一切都很好

env->CallStaticVoidMethod(interfaceClass, sendaString2Java, env->NewStringUTF("Send me to Java")); 

工作得很好。

我真的很重視這裏的例子:http://android.wooyd.org/JNIExample/但從來沒有真正知道爲什麼cpp文件在資產文件夾而不是JNI文件夾。