【发布时间】:2019-07-12 20:04:22
【问题描述】:
我正在尝试从 C++ 库中调用 java 方法。 java的方法在我的android应用中。
但是在获取方法调用时,我得到了异常;
java.lang.NoSuchMethodError:没有非静态方法“Lcom/pkg/tpap/MainActivity;.getDataFromLibLjava/lang/String” public native int initialize();
我还面临另一个例外;
在应用程序中检测到 JNI 错误:GetMethodID 在调用 GetMethodID 时收到 NULL 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");
}
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();
}
【问题讨论】:
-
那么,
getDataFromLib()在哪里?并且请每次都将extern "C" ...放在自己的行中,而不是那样。 -
@user207421 :已编辑问题。请检查。我共享了 sn-p,只有整个代码写得很好。还可以根据需要在原始代码中编写 extern 'C'。
-
如何在Java中声明native方法?
-
@AlexCohn : public native int initialize();代码也更新了
标签: android c++ java-native-interface native jnienv