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

时间:2011-12-15 09:19:44

标签: android android-ndk android-library unsatisfiedlinkerror

我构建了一个Android应用程序,它使用android NDK创建一个共享本机库(.so)来计算sha1,并且它在一个自包含项目中工作得很好。最近虽然我把这个项目变成了一个Android共享项目,并保留了jni代码。然后我创建了一个引用共享项目的新项目,项目似乎正常工作,除了我在调用本机函数时得到UnsatisfiedLinkError。 从名为Hash的Java类中调用本机函数。在这个类中,有一些本机函数可以调用计算文件的sha1哈希值。

ndk / jni代码正在编译,它确实进入应用程序的APK,但是我继续得到错误。我已经在我的手机上卸载了应用程序,完成了ndk-build清理,以确保它没有旧的引用。等等,没有运气。我还确保我的jni函数的名称与

匹配

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

Hash.java

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下的库项目中 我不知道这里发生了什么。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

好吧,我讨厌回答我自己的另一个问题,但经过几个小时的努力,我觉得我终于明白了。在我的应用程序的清单中,我需要设置

<强>的AndroidManifest.xml

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

这很奇怪,因为在大多数我在线阅读的文档中都没有提到使用它,我认为这只是市场用于解决应用程序之间依赖关系的东西(而不是库的依赖关系)。此外,我觉得奇怪的是,该项目编译并运行时至少没有发出警告,当时我没有那个。

- 更新 - 2014年1月 -

应用程序不再需要编译和运行。如果你使用相对较新的(大约1。5年内)Android构建工具,你根本不需要这个。我在一年多的时间里没有遇到这个问题。