gpt4 book ai didi

java - Android JNI : SIGSEGV on CallObjectMethod

转载 作者:行者123 更新时间:2023-12-01 12:55:01 27 4
gpt4 key购买 nike

我正在尝试调用自定义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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com