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

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

概述我构建了一个Android应用,该应用使用AndroidNDK制作了一个共享的本机库(.so)来计算sha1,并且在一个独立项目中运行时效果很好.最近,尽管我将该项目变成了Android共享项目,并在其中保存了jni代码..然后我创建了一个引用共享项目的新项目,该项目似乎正常工作,除了在调用本机函数时收

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

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

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

哈希

package com.mydomain.sdk.util.Hashpublic 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 := -llogLOCAL_MODulE    := native_sha1LOCAL_SRC_fileS := sha1.c sha1_native.cinclude $(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 lib12-15 12:34:13.153: D/dalvikvm(31567): Trying to load lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f812-15 12:34:13.163: D/dalvikvm(31567): Added shared lib /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f812-15 12:34:13.163: D/dalvikvm(31567): No JNI_OnLoad found in /data/data/com.mydomain/lib/libnative_sha1.so 0x4051e4f8, skipPing init12-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构建工具,则完全不需要.我已经有一年多没有这个问题了.

总结

以上是内存溢出为你收集整理的调用驻留在Android库项目中的本机函数时,Android NDK UnsatisfiedLinkError全部内容,希望文章能够帮你解决调用驻留在Android库项目中的本机函数时,Android NDK UnsatisfiedLinkError所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1072860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存