首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >System.loadLibrary(...)在我的情况下找不到本机库

System.loadLibrary(...)在我的情况下找不到本机库
EN

Stack Overflow用户
提问于 2014-12-11 18:54:39
回答 13查看 141.7K关注 0票数 102

我想使用来自另一个安卓项目的现有本地库,所以我只是将构建的库(libcalculate.so)复制到我的新安卓项目中。在我的新安卓项目中,我创建了一个文件夹libcalculate.so并将libs/armeabi/放在那里。没有 jni/文件夹。我的测试设备采用ARM架构。

在我的java代码中,我通过以下方式加载库:

代码语言:javascript
复制
  static{
    System.loadLibrary("calculate");
  }

当我运行我的新android项目时,我得到了错误:

代码语言:javascript
复制
java.lang.UnsatisfiedLinkError:  ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"

所以,正如错误所说,复制的本地库不在/verdor/lib或/system/lib中,在我的情况下如何解决这个问题?

(我解压了apk包,在lib/下有libcalculate.so)

====UPDATE=====

我还尝试在项目根目录下创建一个jni/文件夹,并在jni/下添加一个Android.mk文件。Android.mk的内容是:

代码语言:javascript
复制
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := libcalculate
LOCAL_SRC_FILES := libcalculate.so
include $(PREBUILT_SHARED_LIBRARY)

然后,在项目根目录下,执行ndk-build。之后,由ndk-build生成armeabi/和armeabi-v7a/目录(文件夹中包含libcalculate.so )。

然后我运行我的maven,成功地构建项目。在最终的apk包中,有:

代码语言:javascript
复制
lib/armeabi/libcalculate.so
lib/armeabi-v7a/libcalculate.so

但是当我运行我的应用程序时,同样的错误抛出:

代码语言:javascript
复制
java.lang.UnsatisfiedLinkError:  ...
nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libcalculate.so"
EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2014-12-17 18:26:28

要从根本上解决问题(也许还能同时解决你的问题),你可以这样做:

  1. 删除jni文件夹和所有.mk文件。如果你没有编译任何东西,你不需要这些也不需要NDK。
  2. <project>/libs/(armeabi|armeabi-v7a|x86|...)中复制你的libcalculate.so文件。当使用Android Studio时,它是<project>/app/src/main/jniLibs/(armeabi|armeabi-v7a|x86|...),但我看到您使用的是eclipse。
  3. 构建您的libcalculate.so并将其作为压缩文件打开,以检查您的APK文件是否在eclipse中,并安装您的application
  4. Run虚拟程序包包| grep your yourpackagename以获取您的application.
  5. Run ls在您拥有的nativeLibraryPath或legacyNativeLibraryDir/armeabi上的nativeLibraryPath或legacyNativeLibraryDir,以检查您的libcalculate.so是否确实在那里。
  6. 检查它是否未从原始libcalculate.so文件中更改:它是否针对正确的体系结构进行了编译,是否包含预期的符号,是否有任何丢失的依赖项。您可以使用readelf.

来分析libcalculate.so

为了检查步骤5-7,您可以使用我的应用程序,而不是命令行,并读取step:Native Libs Monitor

PS:在默认情况下,.so文件应该放在哪里或在哪里生成很容易让人感到困惑,下面是总结:

在小于5.0版本的设备上,在应用程序的nativeLibraryPath中,在应用程序的legacyNativeLibraryDir/CPU_ARCH中,在Android Studio project

  • jni/CPU_ABI中,在AAR

  • lib/CPU_ABI中,在最终的APK

  • 中,在>=5.0设备上,在应用程序的legacyNativeLibraryDir/CPU_ARCH中使用
  • libs/CPU_ABI

其中CPU_ABI是以下任意一种: armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。这取决于你的目标架构和你的库已经编译好了。

还请注意,库不会在CPU_ABI目录之间混合:您需要使用的所有库,如果armeabi-v7a文件夹中有来自APK的库,则不会在armeabi-v7a设备上安装armeabi -v7a文件夹中的库。

票数 186
EN

Stack Overflow用户

发布于 2015-03-24 23:49:04

在gradle中,将所有文件、文件夹复制到libs/

代码语言:javascript
复制
jniLibs.srcDirs = ['libs']

将上述代码行添加到build.gradle文件中的sourceSets中即可。其他任何东西都不起作用。

票数 24
EN

Stack Overflow用户

发布于 2015-10-27 21:06:59

在我的例子中,我必须排除使用gradle编译源代码,并设置libs路径

代码语言:javascript
复制
android {

    ...
    sourceSets {
        ...
        main.jni.srcDirs = []
        main.jniLibs.srcDirs = ['libs']
    }
....
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27421134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档