Android jni NoSuchMethodError exception
Android jni NoSuchMethodError exception
我正在尝试从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 中注册我的本机方法,而不是简单的命名约定方法。我个人认为它更强大。
相关文章:
- 为重写std::exception的库生成swig接口时出错
- 什么是 std::exception::what() 以及为什么要使用它?
- 链表"exception thrown"
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- C++ broken_promise exception
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- QVTKWidget SetRenderWindow() with PCLVisualizer Exception
- 自定义派生的 std::exception 类的 'what' 函数返回神秘的废话
- 使用flag、return、exception、goto或break中止过程
- 由于某种原因,我的代码中出现了 [json.exception.type_error.302]。我知道错误意味着什么,但我不知道哪里有故障
- 派生自 std::exception 的类的赋值运算符
- 尝试打印字符串时"Python Exception <class 'gdb.error'> There is no member named _M_dataplus."
- std::exception :使用虚函数和继承与变量
- MFC ODBC SQLConfigDataSource() Unhandled Exception
- 这段 C++ 代码的奇怪行为(std::wcout 和 std::exception)
- VTK 7.1.1: vtkX3DExporter exception
- 无法在"catch(const std::exception &ex)"中捕获 std::invalid_argument
- opencv cv::addText exception if no window
- Ctypes: OSError: exception: stack overflow
- C++ CMake 构建错误:未定义对"boost::throw_exception(std::exception const&)"的引用