Android JNI:CallObjectMethod上的SIGSEGV

时间:2014-06-01 01:43:36

标签: 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");
    }
}

这是本机代码

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

1 个答案:

答案 0 :(得分:1)

只是从记忆中看到你的片段,有两件事我想指出:

(JNIEnv *env , jclass, jobject myObj)

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

(JNIEnv *env , jclass jclazz, jobject myObj)

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