【问题标题】:Invoke Java code from C++ crashes on Android从 C++ 调用 Java 代码在 Android 上崩溃
【发布时间】:2012-02-28 14:22:42
【问题描述】:

PS:实际上,这是有效的,我有另一个问题,我会尽快更新这个问题。

我有以下原生代码:

JNIEXPORT void JNICALL Java_com_rmsdk_wrapper_RMServices_init(JNIEnv *env, jobject thiso,
        jstring prodName, jstring version) {

    jclass thisClass = env->GetObjectClass(thiso);

    __android_log_print(ANDROID_LOG_DEBUG, "APP", "[findMethodId]");        
    jmethodID getDeviceName = env->GetMethodID(thisClass, "getDeviceName", "()Ljava/lang/String;");

    __android_log_print(ANDROID_LOG_DEBUG, "APP", "[invoke]");      
    jstring dvcName = (jstring) env->CallObjectMethod(thiso, getDeviceName);

    __android_log_print(ANDROID_LOG_DEBUG, "APP", "[strings retrivied]");

以及 Java 类中的相应方法

public String getDeviceName() {
    String deviceName = Build.MODEL;
    LogU.v("APPServices", "getDeviceName("+deviceName+")");
    return deviceName;
}

但是在运行时会发生以下情况:

D/RMSDK:DRM(3717): [findMethodId]
D/RMSDK:DRM(3717): [invoke]
I/DEBUG(27674): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG(27674): Build fingerprint: 'MOTO/PORTLA/wifi_hubble:3.2/H.6.6-27/1317781165:user/ota-rel-keys,release-keys'
I/DEBUG(27674): pid: 3717, tid: 3717  >>> br.com.abril.iba <<<
I/DEBUG(27674): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG(27674):  r0 00000000  r1 40c33038  r2 5651b1ec  r3 be86444c
I/DEBUG(27674):  r4 0000008c  r5 8282a018  r6 82805e28  r7 826f0a68

正在找到该方法,但在调用它时会崩溃(任何方法都会),我该如何解决?我不确定为什么它不起作用。

PS:Android NDK5 和 NDK7B 也会出现同样的错误

【问题讨论】:

  • 你确定 thiso 不为 NULL 吗?而thisClass不是NULL吗?并且 getDeviceName 不为 NULL?

标签: android android-ndk java-native-interface android-ndk-r5 android-ndk-r7


【解决方案1】:

您的代码在我的 HTC Desire Z 上运行良好,我使用 android-ndk-r7b 编译了本机部分。您确定在执行init(String s1, String s2); 的同一类中有方法getDeviceName() 吗? 我使用了以下java代码:

public class HelloJni extends Activity {

public native void init(String s1, String s2);



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init("","");
}

static {
    System.loadLibrary("hello-jni");
}

public String getDeviceName() {
    String deviceName = Build.MODEL;
    Log.v("APPServices", "getDeviceName("+deviceName+")");
    return deviceName;
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多