Android jni NoSuchMethodError异常 我尝试从C++ LIB调用java方法。java的方法在我的android应用程序中

Android jni NoSuchMethodError异常 我尝试从C++ LIB调用java方法。java的方法在我的android应用程序中,android,c++,java-native-interface,native,jnienv,Android,C++,Java Native Interface,Native,Jnienv,但是在得到方法调用时,我得到了异常 java.lang.NoSuchMethodError:没有非静态方法“Lcom/pkg/tpap/MainActivity;.getDataFromLibLjava/lang/String” 公共本机int initialize() 我还面临着另一个例外 JNI在应用程序中检测到错误:GetMethodID在调用GetMethodID时收到空jclass 我的问题是,NoSuchMethodError的第一个错误发生在initialise()方法的MainA

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

java.lang.NoSuchMethodError:没有非静态方法“Lcom/pkg/tpap/MainActivity;.getDataFromLibLjava/lang/String” 公共本机int initialize()

我还面临着另一个例外

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

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

第二个问题是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");
}

<强> nTiVal.cpp(我试图调用java方法的库中C++源文件)<强> < /p>

#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");
}
GetMethodID()
使用
“(Ljava/lang/String;)V“
。我认为您的函数调用语法不正确

我之前已经做过,我在代码中使用了这样的参数语法,它很有效。但我无法将您的异常与此错误联系起来,因此我不确定这是否解决了您的问题。但是我认为你的函数调用参数应该是这样的


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

那么,
getDataFromLib()在哪里呢?
?请每次都把
extern“C”…
放在它自己的行上,不要这样。@user207421:question-edited。请查收。我分享了这个片段,但整个代码都写得很好。还使用原始代码编写了extern“C”。如何在Java中声明本机方法?@AlexCohn:public native int initialize();代码也更新了
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();

}