当前位置: 首页 > 知识库问答 >
问题:

UnsatisfiedLinkError:无法在Nfc系统应用程序中加载自定义NDK JNI库

赫连子石
2023-03-14

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

在/aosp/packages/apps/nfc/中创建了一个/JNI目录,我在这里编写了以下JNI代码。NFC/JNI/dir有两个文件,即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;
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mycustomlib
LOCAL_SRC_FILES := mycustomlib.c
include $(BUILD_SHARED_LIBRARY)
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闪存到Nexus7设备上。操作系统正确引导,但我们得到以下错误:

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个答案

邓毅
2023-03-14

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

我将尝试用库加载调用替换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;
}
 类似资料:
  • 我将dll路径存储在设置文件中。当我输出 如果我在project中添加(dll)作为外部类文件夹,并编写:,它可以在这台机器中工作,但是当我使用可运行的jar时,它找不到,所以我想给出dll的绝对路径。但对我没用。 我也试过: C:\users\argenit\desktop\aaa\dll\ergopointer_64_bit dll\ergopointer_64_bit.dll ergopoi

  • 我创建了一个使用jar文件女巫.dll库。Jar在我的主PC和笔记本电脑上运行平稳,但现在我正试图在新安装Windows 10的PC上使用它,我收到此错误: 线程“main”java.lang.UnsatisfiedLinkError:无法加载库“AutoHotkey”:无法获取win32-x86-64/AutoHotkey的InputStream。位于com.sun.jna.Library$Ha

  • 我在我的项目中使用的是umbraco 4.11.3。我的项目在Windows 7上运行良好,并在visual studio 2012上运行。但它在Win 8中从visual studio 2012运行时并不工作! 错误是: 无法加载文件或程序集“System.Web”。Mvc,Version=2.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e

  • Home assistant 支持设备显示的高度自定义,你可以给设备更换昵称、图标、图标以及隐藏设备等。 设置方法 设备的个性化由 customize 模块定义,默认配置文件 configuration.yaml 中 customize 位于 homeassistant模块下: homeassistant: # 名称,可为中文 name: 家 # 纬度 latitude: !sec

  • 我过去常常使用自定义声音来保存在res/raw中的通知。要求不允许其他应用程序使用此声音。 使用Android 8通知通道,我能够通过将用户从系统通知首选项重定向到应用程序首选项来解决问题,从那里我可以在其他android提供的声音中显示自定义声音。当用户更改通知声音时,会创建新的通知通道。 现在我进入了下一个级别,我需要在应用程序处于后台时为Firebase云消息传递提供这种声音。 更新:我需要

  • 我正在处理一个Spring Boot应用程序,其中我使用该应用程序公开SOAP WebService。我在Spring boot应用程序中使用Apache CFX framework for SOAP impl。我正在使用基于注释的方法。 我在一个bean中的Spring Boot配置文件中设置应用程序上下文时遇到了问题。下面是我的代码。 配置文件如下所示。 现在我有了bean SOAPproce