gpt4 book ai didi

java - 从 C++ 调用 java 代码 : exception java. lang.NoSuchMethodError

转载 作者:行者123 更新时间:2023-12-01 14:30:19 24 4
gpt4 key购买 nike

我正在尝试从 JNI C++ 函数调用一些 java 代码,但出现异常:java.lang.NoSuchMethodError

调用java代码的C++代码是从另一个本地库调用的回调函数。当我使用中描述的设置时,这段代码工作得很好 here :

基本上是一个使用 JNI 的 APK,并且 JNI 正在调用在别处编译的 native 库)。

但后来我想在 AOSP 中编译我所有的代码,所以我将我的原生库代码、JNI 和 APK 代码放在 vendor/MyCode/MyApp 中。它编译良好,从 java 调用的 native 方法工作正常,但从 JNI 调用的 java 代码现在全部崩溃。

这是我想从 JNI 调用的方法的 java 代码:

package com.android.mycode.myapp;

import android.app.Activity;

public class MainActivity extends Activity implements OnClickListener
{
private native int powerOn();

...

public void ndefRead(int tech, int protocol, byte[] ndef)
{
Log.d(tag, "ndefRead()");
Message msg = mHandler.obtainMessage();
msg.what = MSG_NDEF_READ_RECEIVED;
msg.obj = ndef;
msg.arg1 = tech;
msg.arg2 = protocol;
mHandler.sendMessage(msg);
}

...
}

我在其中注册 java 数据的 JNI 代码:

JNIEXPORT jint JNICALL
Java_com_android_mycode_myapp_MainActivity_powerOn(JNIEnv * env, jobject obj)
{
LOGD("calling powerOn()"); //Or ANDROID_LOG_INFO, ...

env->GetJavaVM(&javaVM);
jclass cls = env->GetObjectClass(obj);
activityClass = (jclass) env->NewGlobalRef(cls);
activityObj = env->NewGlobalRef(obj);
...
return status;
}

调用java代码的回调函数的JNI代码:

void EventCallback(UINT8 event, tEVT_CBACK_DATA* eventData)
{
LOGD("EventCallback() - event: 0x%x", event);

switch (event)
{
case NDEF_READ_EVT:
{
LOGD("EventCallback() - NDEF_READ_EVT - data length: 0x%x", eventData->ndefReadEvt.length);

JNIEnv *env;
javaVM->AttachCurrentThread(&env, NULL);

jmethodID ndefReadID = env->GetMethodID(activityClass, "ndefRead", "(II[B)V");
if (ndefReadID == 0)
{
LOGD("Function ndefRead() not found");
return;
}

jbyteArray result = env->NewByteArray(eventData->ndefReadEvt.length);
if (result != NULL)
{
env->SetByteArrayRegion(result, 0, eventData->ndefReadEvt.length, (jbyte *) eventData->ndefReadEvt.p_ndef);
}

env->CallVoidMethod(activityObj, ndefReadID, eventData->ndefReadEvt.tech, eventData->ndefReadEvt.protocol, result);
javaVM->DetachCurrentThread();
}
break;
}

JNI 的 makefile 如下所示:

LOCAL_MODULE    := libinterface
LOCAL_SRC_FILES := interface.cpp
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := libnfc-nci

当执行这段代码时,我收到以下异常/错误消息:

Pending exception java.lang.NoSuchMethodError thrown by 'unknown throw location'
java.lang.NoSuchMethodError: no non-static method "Lcom/android/mycode/myapp/MainActivity;.ndefRead(II[B)V"

我查看了此站点上报告的其他几个此类问题,但找不到与我的问题完全相似的问题。如果有人有想法,将不胜感激。

编辑以添加 ndefRead() 函数的代码和 JNI 的 makefile。

最佳答案

这些错误通常是由 make 文件或错误的文件命名引起的。

我没有看到任何 static { System.loadLibrary("your-c-module"); },如android MK中定义的,例如:

#android.mk

include $(CLEAR_VARS)

LOCAL_MODULE := your-c-module
LOCAL_SRC_FILES := main.cpp
LOCAL_STATIC_LIBRARIES += fancy-library
LOCAL_LDLIBS += -llog -ldl

还有,不知道你过滤了没有,如果Java_com_android_st_nfcnintendothread_MainActivity_powerOn是你的c函数,那么你的包名应该是:com.android.st.nfcnintendothread 及其功能:MainActivity.powerOn

我只是在这里吐口水,希望你能在上面找到有用的东西。

关于java - 从 C++ 调用 java 代码 : exception java. lang.NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28960190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com