不满意的链接错误:无法在Nfc系统应用程序中加载自定义NDK JNI库

时间:2013-12-02 20:34:38

标签: android android-ndk java-native-interface android-source

我已经使用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)

我已经阅读了所有相关问题,但我仍然不确定发生了什么。有没有人有任何线索?谢谢!

1 个答案:

答案 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方法是本机方法。

希望它有所帮助!