Android jni NoSuchMethodError异常

时间:2019-07-12 20:04:22

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

我正在尝试从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();

}

1 个答案:

答案 0 :(得分:1)

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

我以前已经这样做过,我在代码中使用了像这样的参数语法,并且可以正常工作。但是我无法以某种方式将您的异常与该错误相关联,因此我不确定这是否可以解决您的问题。但是我认为您的函数调用参数应该像这样。

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