我正在尝试从C ++ lib调用Java方法。 Java的方法在我的android应用程序中。
但是在获取方法调用时,我得到了异常;
java.lang.NoSuchMethodError:没有非静态方法“ Lcom / pkg / tpap / MainActivity; .getDataFromLibLjava / lang / String” 公共本地int initialize();
我还面临另一个例外;
JNI在应用程序中检测到错误:GetMethodID在调用GetMethodID时收到NULL jclass
我的问题是,NoSuchMethodError的第一个错误发生在MainActivity.java中的Initialize()方法中,我在声明中出错了。
第二个问题是在工作代码中出现了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");
}
MainActivity.java SNIPPET
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();
}
答案 0 :(得分:1)
将"(Ljava/lang/String;)V"
用于GetMethodID()
。我认为您的函数调用语法不正确。
我以前已经这样做过,我在代码中使用了像这样的参数语法,并且可以正常工作。但是我无法以某种方式将您的异常与该错误相关联,因此我不确定这是否可以解决您的问题。但是我认为您的函数调用参数应该像这样。
此外,我个人使用RegisterNatives()
在Java中注册本机方法,而不是简单的命名约定方法。我个人认为它更强大。