我已经使用JNI编写了一个小型C程序,我想从NFC系统应用程序内部调用,特别是NfcDispatcher.java类。到目前为止,我已经做了以下事情:
在/ AOSP / packages / apps / Nfc /中创建了一个/ jni目录,我编写了以下JNI代码。 Nfc / jni / dir有2个文件,即mycustomlib.c和Android.mk,如下所示
mycustomlib.c at /AOSP/packages/apps/Nfc/jni/mycustomlib.c
#include <string.h>
#include <jni.h>
jstring Java_com_android_nfc_NfcDispatcher_gettagkey( JNIEnv* env, jobject thiz, jstring tagKey )
{
// do something
return tagKey;
}
Android.mk at /AOSP/packages/apps/Nfc/jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mycustomlib
LOCAL_SRC_FILES := mycustomlib.c
include $(BUILD_SHARED_LIBRARY)
我从NfcDispatcher.java文件中调用本机方法“gettagkey”,如下所示。
NfcDispatcher.java 位于/AOSP/packages/apps/Nfc/src/com/android/nfc/NfcDispatcher.java
public class NfcDispatcher {
..
..
public static native String gettagkey(String tagKey);
..
static class DispatchInfo {
..
}
public boolean dispatchTag(Tag tag) {
..
..
Log.d(TAG, "NFC Key Tag from C code : " + gettagkey(sb.toString()));
..
}
..
static {
System.loadLibrary("mycustomlib");
}
}
然后我们使用ndk-build -C path_to_c_code编译C代码 然后我们做了一个“make -j32”来编译Nfc系统应用程序中更改的代码 然后我们将新的system.img刷新到Nexus 7设备。操作系统正常启动但我们收到以下错误:
W/dalvikvm( 767): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/android/nfc/NfcDispatcher;
E/AndroidRuntime( 767): at com.android.nfc.NfcDispatcher.<clinit>(NfcDispatcher.java:571)
E/AndroidRuntime( 767): at com.android.nfc.NfcService.<init>(NfcService.java:390)
E/AndroidRuntime( 767): at com.android.nfc.NfcApplication.onCreate(NfcApplication.java:43)
我已经阅读了所有相关问题,但我仍然不确定发生了什么。有没有人有任何线索?谢谢!
答案 0 :(得分:0)
我觉得在本机方法的本机调用之前没有加载本机库。
我会尝试使用库加载调用替换gettagkey主体,然后调用本机方法。类似的东西:
public static String gettagkey(String tagKey){
System.loadLibrary("mycustomlib");
gettagkeyNative(tagKey);
}
public static native String gettagkeyNative(String tagKey);
不要忘记修改原生部分:
#include <string.h>
#include <jni.h>
jstring Java_com_android_nfc_NfcDispatcher_gettagkeyNative( JNIEnv* env, jobject thiz, jstring tagKey)
{
// do something
return tagKey;
}
此解决方案可行,除非系统调用本机方法要求gettagkey方法是本机方法。
希望它有所帮助!