java - Android JNI : SIGSEGV on CallObjectMethod

标签 java android java-native-interface jnienv

我正在尝试调用自定义Java类型的方法,但收到SIGSEGV信号。

这是Java代码

package com.example.JniApi;
public class JniApi {   
    public void test()
    {
        MyType obj = new MyType();
        nativePrintMyTypeMsg(obj);
    }
    public static native void nativePrintMyTypeMsg(MyType obj);
}

public class MyType {
    public void printMsg()
    {
        android.util.Log.d("TestJni", "From Java");
    }
}

这是 native 代码

JNIEXPORT void JNICALL Java_com_example_JniApi_JniApi_nativePrintMyTypeMsg
(JNIEnv *env , jclass, jobject myObj)
{
    jclass myTypeClass = env->GetObjectClass(myObj);
    jmethodID printMsgMethodId = env->GetMethodID(myTypeClass,"printMsg", "()V");
    for(size_t i = 0; i < 1000; ++i){
        env->CallObjectMethod(myObj, printMsgMethodId);
    }
    return;
}

最佳答案

仅凭内存并查看您的代码 fragment ,我想指出两件事:

(JNIEnv *env , jclass, jobject myObj)

这个签名看起来有点奇怪,第二个参数缺少参数对象。为了理智起见,请将其更改为

(JNIEnv *env , jclass jclazz, jobject myObj)

接下来可能更重要的是,MyType 类中的 printMsg() 方法实际上返回 void。要通过 JNI 调用 void 方法,您需要通过 CallVoidMethod 来调用它。更多信息请查看JNI Documentation

关于java - Android JNI : SIGSEGV on CallObjectMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23976044/

相关文章:

java - 运行时出现空指针异常。

android - 声明在多个 Activity 中使用的常量的最佳实践

c++ - 将JNI代码移植到java并理解jdouble * 用法

android - 在 Android 中每秒更新一次 TextView

来自psd的Android Vector drawable预览为空

java - 由于递归依赖关系,Java 中出现 UnsatisfiedLinkError(找不到依赖库)

android - 无法使 javah 与我的 Eclipse Android 项目一起工作

java - Vaadin 使用监听器在 Web 浏览器中打开新选项卡

java - 如何根据图像在屏幕上的放置位置显示消息

java - 如何在JAVA中对列表中的每个元素运行函数?