Android jni NoSuchMethodError exception

Android jni NoSuchMethodError exception

本文关键字:exception NoSuchMethodError jni Android      更新时间:2023-10-16

我正在尝试从C++库调用java方法。java的方法在我的安卓应用程序中。

但是在获得方法调用时,我得到了异常;

java.lang.NoSuchMethodError: no non-static method "Lcom/pkg/tpap/MainActivity;.getDataFromLibLjava/lang/String" public native int initialize();

我还有另一个例外;

JNI 在应用程序中检测到错误:GetMethodID 在调用 GetMethodID 时收到空 jclass

我的问题是,NoSuchMethodError 的第一个错误发生在 MainActivity 中.java对于 initialise() 方法,我在声明中出错了。

第二个问题是GetMethodID已经出现在工作代码中,我将如何解决它?

分享下面的代码,

native-lib.cpp ( 方法在头文件中正确声明)

#include "jni.h" 
#include "custom_main.h"
#include <android/log.h>
JavaVM *my_jvm;
jobject activity;
extern "C"
JNIEXPORT jint JNICALL
Java_com_pkg_tpap_MainActivity_initialize(JNIEnv *env, jobject instance) {
activity = env->NewGlobalRef(instance);
return my_initialize(my_jvm, activity);
}extern "C"
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *aReserved) {
__android_log_print(ANDROID_LOG_INFO, "mylog", "OnLoad called");
my_jvm = vm;
return JNI_VERSION_1_6;
}extern "C"
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) {
__android_log_print(ANDROID_LOG_INFO, "mylog", "OnUnload");
}

主活动.java 片段

static {
System.loadLibrary("native-lib");
}
//this method is called on a button click to initialise the library
public void initAppLib() {
initialize();
}
//this method will give the data sent from the c++ lib
public void getDataFromLib(String rawJson) {
Log.e("responseData", rawJson);
}
//native method declared here
public native int initialize();

NativeProgram.cpp(库中的c ++源文件,我试图从中调用java方法)

void callJavaMethod(const std::string& stringToPrint) {
JNIEnv* env;
jint result1 = newVM->GetEnv((void**)&env, JNI_VERSION_1_6);
if (result1 == JNI_EDETACHED) {
result1 = newVM->AttachCurrentThread(&env, NULL);
} 
jclass clazz = env->GetObjectClass(activity);
jmethodID mid = env->GetMethodID(clazz, "getDataFromLib", "Ljava/lang/String");
jstring data = env->NewStringUTF(stringToPrint.c_str());
env->CallVoidMethod(activity, mid, data);
env->DeleteLocalRef(clazz);
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
newVM->DetachCurrentThread();
}

使用"(Ljava/lang/String;)V"表示GetMethodID()。我认为您的函数调用语法不正确。

我以前做过这个,我在代码中使用了这样的参数语法并且它有效。但是我不知何故无法将您的异常与此错误联系起来,所以我不确定这是否可以解决您的问题。但我认为你的函数调用参数应该是这样的。

此外,我个人使用RegisterNatives()在 Java 中注册我的本机方法,而不是简单的命名约定方法。我个人认为它更强大。