调用驻留在Android库项目中的本机函数时,Android NDK UnsatisfiedLinkError

我构建了一个Android应用,该应用使用Android NDK制作了一个共享的本机库(.so)来计算sha1,并且在一个独立项目中运行时效果很好.最近,尽管我将该项目变成了Android共享项目,并在其中保存了jni代码..然后我创建了一个引用共享项目的新项目,该项目似乎正常工作,除了在调用本机函数时收到UnsatisfiedLinkError.
本机函数从名为Hash的Java类中调用.在该类内部,有一些本机函数可以调用以计算文件的sha1哈希.

ndk / jni代码正在编译,并且确实进入了应用程序的APK,但是我继续遇到该错误.我已经在手机上卸载了该应用程序,并对其进行了ndk-build清理,以确保其没有旧的引用.等等.我还确保jni函数的名称与

所以这是我的代码的要点:

哈希

package com.mydomain.sdk.util.Hash

public class Hash {
    static {
      System.loadLibrary("native_sha1")
    }

    public static native String getFileHashNative(String fileName);

}

然后我有(在同一项目中

jni / Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE    := native_sha1
LOCAL_SRC_FILES := sha1.c sha1_native.c
include $(BUILD_SHARED_LIBRARY)

jni / sha1_native.c

jstring Java_com_mydomain_sdk_util_Hash_getFileHashNative(JNIEnv * env, jclass this, jstring fileName)
{
  //call function from sha1.c to get sha1, return to user
}

无论如何,这一切都很好,直到我更改了项目的结构,以便我可以重用通用代码(将其放入android库项目中).如果我编译我的应用程序并打开.apk文件,我可以看到一个lib目录,其中有armeabi / libnative_sha1.so文件.因此,它在那里肯定是无法正常工作.

更新-一些调试信息

好的,所以我添加了一些调试功能..我从静态块中取出了loadLibrary,并将其放入要调用Hash.getFileHashNative的函数中

12-15 12:34:13.143: D/Hash(31567): Attempting to load native_sha1 lib
12-15 12:34:13.153: D/dalvikvm(31567): Trying to load lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8
12-15 12:34:13.163: D/dalvikvm(31567): Added shared lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8

12-15 12:34:13.163: D/dalvikvm(31567): No JNI_OnLoad found in /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8, skipping init
12-15 12:34:13.163: W/dalvikvm(31567): No implementation found for native Lcom/mydomain/sdk/util/Hash;.getFileHashNative (Ljava/lang/String;)Ljava/lang/String;

我不确定是什么原因引起的,但看来它显然找不到该功能.
我唯一要修改的是mydomain的名称,其他所有内容都是准确的.
另请注意,我的库项目的包名称为com.mydomain.sdk,而我的应用程序项目仅为com.mydomain
sha1的源代码位于com.mydomain.sdk.util.Hash下的库项目中
我不明白这是怎么回事.有任何想法吗?

解决方法:

好吧,我不想回答我自己的另一个问题,但是经过数小时的努力,我想我终于明白了.在我的应用清单中,我需要设置

AndroidManifest.xml

 <uses-library android:name="com.mydomain.sdk" android:required="true" />

这很奇怪,因为在我在线上阅读的大多数文档中,他们都没有提到使用此功能,我认为这只与市场用来解决应用程序之间的依赖关系(而不是库的依赖关系)有关.我也感到奇怪的是,当我在那里没有该项目时,该项目根本没有发出警告就完全编译并运行了.

-更新-2014年1月-

应用程序不再需要编译和运行.如果您使用的是相对较新的(大约1.5年内)的Android构建工具,则完全不需要.我已经有一年多没有这个问题了.

上一篇:servlet request getHeader x-forwarded-for 获取真实IP


下一篇:java VLCJ教程java.lang.UnsatisfiedLinkError