【问题标题】:Unsatisfiedlinkerror: Unable to load custom NDK JNI library in Nfc system appUnsatisfiedlinkerror: Unable to load custom NDK JNI library in Nfc system app
【发布时间】:2013-12-03 05:40:51
【问题描述】:

我使用 JNI 编写了一个小型 C 程序,我想从 NFC 系统应用程序内部调用它,特别是 NfcDispatcher.java 类。到目前为止,我已经完成了以下操作:

在 /AOSP/packages/apps/Nfc/ 中创建了一个 /jni 目录,我在其中编写了以下 JNI 代码。 nfc/jni/ dir 有 2 个文件,即 mycustomlib.c 和 Android.mk,分别如下

mycustomlib.c 在 /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 位于 /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)

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

【问题讨论】:

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


    【解决方案1】:

    我感觉在对本机方法进行本机调用之前没有加载本机库。

    我会尝试用库加载调用替换 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 方法是本机的,否则此解决方案将起作用。

    希望对你有帮助!

    【讨论】:

    • 谢谢,但我不知道为什么会这样。问题发生在 System.loadLibrary("mycustomlib") 行上,我刚刚尝试了您建议的更改。调用 System.loadLibrary 时仍然出现错误。唯一的区别是现在我在不同的线路上得到它。 E/AndroidRuntime(863):java.lang.UnsatisfiedLinkError:无法从加载器 dalvik.system.PathClassLoader[DexPathList[[zip 文件“/system/app/NfcNci.apk”],nativeLibraryDirectories=[/vendor/lib , /system/lib]]]: findLibrary 返回 null
    • 发布您的 Application.mk 文件,也许您已经为正在执行的不同架构编译了库。
    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2022-12-27
    • 2015-07-18
    • 2022-12-19
    • 2022-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多