【问题标题】:Android NDK crash in CallObjectMethod calling static method with ART使用 ART 调用静态方法的 CallObjectMethod 中的 Android NDK 崩溃
【发布时间】:2015-03-26 11:43:50
【问题描述】:

在一个 Android 应用程序中,我有一些调用 java 静态方法的 JNI 代码。

jbyteArray response = (jbyteArray)pEnv->CallObjectMethod(handlerClass, mid, jstrServiceUrl, jstrRequest);

ART 环境中的 Android 5 中执行它,我得到一个 check jni 错误:

在应用程序中检测到 JNI 错误:在调用 CallObjectMethodV 时使用 CallObjectMethodV 调用静态方法 byte[] x.y.z(java.lang.String, java.lang.String)...

我在带有 Dalvik 环境的 Android 4 中没有收到此错误。

java方法就是这个:

public static byte[] z(String serviceURL, String request) 

之前是这样绑定的:

jclass handlerClass = pEnv->FindClass("x/y/z");
if (handlerClass == NULL) {
    return -1;
}

mid = pEnv->GetStaticMethodID(handlerClass, "z", "(Ljava/lang/String;Ljava/lang/String;)[B");
if (mid == NULL) {
    return -2;
}

// Construct Strings
jstring jstrServiceUrl = pEnv->NewStringUTF(szServiceURL);
jstring jstrRequest = pEnv->NewStringUTF(szRequest);

【问题讨论】:

    标签: java android c android-ndk


    【解决方案1】:

    我不知道为什么你的代码可以和 Dalvik 一起工作,但是给 Call<type>Method 的方法 id 必须用 GetMethodID 获得。如果您有使用GetStaticMethodID 获得的方法ID,您应该使用CallStatic<type>Method

    参见the JNI functions documentationCall<type>MethodCallStatic<type>Method的描述。

    【讨论】:

    • @davide.web 你能提供一个有效的代码的sn-p吗?我有类似的问题,但 CallStaticVoidMethod() 不起作用。我不能简单地将 CallVoidMethod() 替换为 CallStaticVoidMethod() 或 CallStaticObjectMethod()
    • @davide.web 啊哈! CallVoidMethod() 和 CallStaticVoidMethod() 之间的区别在于,前者将参数传递给对象,而 CallStaticVoidMethod() 则将指针指向类。有道理。
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多