【问题标题】:problems with JNI on android - Java instance methodsandroid上的JNI问题-Java实例方法
【发布时间】:2011-04-25 21:32:05
【问题描述】:

希望周围有更多知识渊博的人,我走了。从 C 调用 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...]

在任何时候都没有在控制台中显示任何异常跟踪。这些是常见的症状还是什么?

谢谢!

【问题讨论】:

    标签: android crash java-native-interface parameter-passing instance-methods


    【解决方案1】:

    当我对从 c/c++ 到 Java 传递的对象参数变得懒惰之前,我已经看到了这个问题(对我来说,问题似乎是字符串)。

    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 文件位于 assets 文件夹而不是 JNI 文件夹中。

    【讨论】:

      【解决方案2】:

      故障地址 6c6c65bc 处的 SIGSEGV 指示无效的内存引用或分段错误 (SIGSEGV)。
      对于来自本机代码的异常,您必须在 C/C++ 端显式调用方法 ExceptionDescribe()。更多详情请点击此处Exceptions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-28
        • 1970-01-01
        • 2019-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多