2011-04-25 57 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文件夹。