java - Android NDK 在使用 ART 调用静态方法的 CallObjectMethod 中崩溃

标签 java android c android-ndk

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

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

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

JNI DETECTED ERROR IN APPLICATION: calling static method byte[] x.y.z(java.lang.String, java.lang.String) with CallObjectMethodV in call to CallObjectMethodV...

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

java方法是这个:

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

并且之前是这样绑定(bind)的:

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);

最佳答案

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

参见 Call<type>Method 的描述和 CallStatic<type>Methodthe JNI functions documentation .

关于java - Android NDK 在使用 ART 调用静态方法的 CallObjectMethod 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277552/

相关文章:

java - 重复 Stream allMatch() 直到 true

java - 如何在android中的自定义适配器类中调用相机 Intent ?

Android 5.0 构建错误与 Java 版本问题

java - 无法在 Android Studio 中解析符号 "R",但编译没有问题

在 Windows 上创建大文件

java - 有没有办法显示未选择的单选按钮中的文本?

java - Spring Controller /服务/存储库中的泛型

android - 在 Android 服务中使用 BroadcastReceiver 获取电池电量

mysql - 循环 mysql_real_connect 或者什么

c - 查找数组中出现两次的数字