从Android NDK SIGSEGV调用Java方法

时间:2014-01-02 11:25:42

标签: java android c++ android-ndk java-native-interface

我试图从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”在上面的代码段中始终为null。 java类的相关部分是:

public class CameraProcessing
{
private static native boolean processBitmap();

private void setProgressMax(int max)
{
}

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

1 个答案:

答案 0 :(得分:3)

您已将本机processBitmap()方法声明为静态,这意味着第二个参数是jclass而不是jobject。当您致电GetObjectClass时,您实际上正在获取jclass的课程,这意味着callingClass只是java.lang.Class,而没有定义setProgressMax方法。应该有一个待处理的异常,并附上相应的消息。

将声明更改为:

private native boolean processBitmap();

再试一次。

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

另外,请确保在CallVoidMethod返回后检查例外情况。