我正在尝试调用自定义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;
}
答案 0 :(得分:1)
只是从记忆中看到你的片段,有两件事我想指出:
(JNIEnv *env , jclass, jobject myObj)
这个签名看起来有点奇怪,第二个参数缺少参数对象。为了理智,请将其更改为
(JNIEnv *env , jclass jclazz, jobject myObj)
接下来可能更重要的是,printMsg()
- 类中的方法MyType
实际上正在返回void
。要通过JNI调用void方法,您需要通过CallVoidMethod
调用它。有关详细信息,请查看JNI Documentation