0

我正在尝试调用自定义 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");
    }
}

这是本机代码

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;
}
4

1 回答 1

1

仅凭记忆并查看您的代码段,我想指出两件事:

(JNIEnv *env , jclass, jobject myObj)

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

(JNIEnv *env , jclass jclazz, jobject myObj)

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

于 2014-06-04T01:54:10.413 回答