本机库(.so文件)不会添加到android项目中

时间:2013-08-11 15:10:48

标签: android maven intellij-idea android-studio nativelibrary

我正在尝试使用需要使用本机库的sqlitecipher库。他们的教程非常简单,但对我来说不起作用。每次我收到以下错误:

FATAL EXCEPTION: main
        java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader[dexPath=/data/app/org.example.test-2.apk,libraryPath=/data/app-lib/org.example.test-2]: findLibrary returned null
        at java.lang.Runtime.loadLibrary(Runtime.java:365)
        at java.lang.System.loadLibrary(System.java:535)
        at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:141)
        at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:136)

这意味着.so文件在编译期间没有附加。

所有3个文件都存储在/ libs / armeabi /目录中。

我认为问题在于我使用maven来管理依赖项(无论如何都要使用Android Studio进行构建)。下一次尝试 - 将这些库包含在maven依赖项中。根据{{​​3}},这很容易。我在公共存储库中找不到它们所以我使用了<scope>system</scope> 带有标签。它们是可见的,但它不起作用。后来找到了documentation链接,据说范围“系统”不起作用,尝试使用

将这些库添加到本地存储库中
mvn install:install-file -DgroupId=net.sqlitecipher -DartifactId=stlport_shared -Dversion=1.0 -Dfile=libstlport_shared.so -Dpackaging=so -DgeneratePom=true

最终 - 它没有用。

我也看到了这个this,可能这是一个解决方案,但我目前不使用gradle。有没有办法将.so文件包含到apk中,而无需从maven转移到gradle?

据我所知,Android Studio在内部使用gradle来构建apks,所以我对maven的所有努力都没用,直到他们开始支持本机库,我是对的吗?我还尝试用Intellij IDEA Cardea(13.0)构建项目,遗憾的是没有任何成功。

3 个答案:

答案 0 :(得分:10)

只要原生库在/ libs / armeabi /中,你所要做的就是正确配置android插件。像这样:

<plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <configuration>
         <nativeLibrariesDirectory>${project.basedir}/libs</nativeLibrariesDirectory>
         ...
    </configuration>
    <extensions>true</extensions>
</plugin>

答案 1 :(得分:1)

问题1 :是的。 我以前没有遇到过这个具体的问题,但是你根本不需要开始学习。可以使用ant任务将SO文件添加到APK。因为maven可以运行Ant任务。

您找到的{em> nativeLibsToJar here只不过是将所有SO文件放入ZIP文件然后使用扩展名JAR而不是ZIP的任务。您可以使用Ant task Zip(可能还有rename)轻松完成此操作。

问题2 :否。由于第一个答案。没有必要“maven支持本地库”。只需使用Ant作为构建系统。

答案 2 :(得分:1)

你必须使用android studio在android项目中创建.so文件包含的jni文件夹。

我附上图片请按照以下步骤操作。

创建jnilib文件夹后,您可以将所有.so文件放在此文件夹中。enter image description here