从Android NDK SIGSEGV调用Java方法

Calling Java Method from Android NDK SIGSEGV

本文关键字:Java 方法 调用 SIGSEGV Android NDK      更新时间:2023-10-16

我正在尝试从 NDK 代码调用 java 方法。 C++代码为:

extern "C" JNIEXPORT jboolean JNICALL
Java_com_lipman_whiteboard_CameraProcessing_processBitmap(JNIEnv * env, jobject obj)
{
jclass callingClass = env->GetObjectClass(obj);
jmethodID mid = env->GetMethodID(callingClass, "setProgressMax", "(I)V");
env->CallVoidMethod(obj, mid, 7);
}

在上面的代码片段中,"mid"始终为空。java 类的相关部分是:

public class CameraProcessing
{
private static native boolean processBitmap();
private void setProgressMax(int max)
{
}

有谁知道为什么"mid"总是空的?我做错了什么?

您已将本机processBitmap()方法声明为静态,这意味着第二个参数是jclass而不是jobject。 当你调用GetObjectClass时,你实际上是在得到jclass的类,这意味着callingClass只是java.lang.Class,它没有定义一个setProgressMax方法。 应该有一个例外挂起,并带有与此相关的消息。

将声明更改为:

private native boolean processBitmap();

然后重试。

调用私有方法应该不是 JNI 的问题。

此外,请确保在CallVoidMethod返回后检查异常。