本机库(.so文件)未添加到android项目中
我正在尝试使用需要使用本机库的库。他们的教程很简单,但对我来说不起作用。每次出现以下错误时:本机库(.so文件)未添加到android项目中,android,maven,android-studio,intellij-idea,unsatisfiedlinkerror,Android,Maven,Android Studio,Intellij Idea,Unsatisfiedlinkerror,我正在尝试使用需要使用本机库的库。他们的教程很简单,但对我来说不起作用。每次出现以下错误时: 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
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)
这意味着。所以在编译过程中没有附加文件
所有3个文件都存储在/libs/armeabi/目录中
我假设问题在于我使用maven来管理依赖项(无论如何,构建是使用AndroidStudio执行的)。下一次尝试-将这些库包含到maven依赖项中。据我所知,这很容易。我在公共存储库中找不到它们,所以我使用了system
带标签。它们是可见的,但不起作用。后来找到了一个据说作用域“系统”无法工作的链接,尝试使用将这些库添加到本地存储库中
mvn install:install-file -DgroupId=net.sqlitecipher -DartifactId=stlport_shared -Dversion=1.0 -Dfile=libstlport_shared.so -Dpackaging=so -DgeneratePom=true
最后,它没有起作用
我也看到了这一点,也许这是一个解决方案,但我目前不使用gradle。有没有一种方法可以在不从maven移动到gradle的情况下将.so文件包含到apk中
据我所知,Android Studio在内部使用gradle构建APK,所以在maven开始支持本机库之前,我所有的努力都是无用的,对吗?我也尝试过用Intellij IDEA Cardea(13.0)构建这个项目,不幸的是没有成功 问题1:是的。 我以前没有遇到过这种特殊的问题,但一般来说,你不需要转向gradle。可以使用ant任务将SO文件添加到APK。由于maven可以运行Ant任务,这是可能的 您发现的nativeLibsToJar只不过是一个任务,它将所有SO文件放入一个ZIP文件,然后使用扩展名JAR而不是ZIP。您可以很容易地使用(或者另外)
对问题2:没有。因为第一个答案。不需要“maven来支持本机库”。只要使用Ant作为构建系统。一旦本机libs位于/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>
com.jayway.maven.plugins.android.generation2
安卓maven插件
${project.basedir}/libs
...
真的
您必须使用android studio为.so文件创建jni文件夹
我已附上图片,请按照这些步骤
创建jnilib文件夹后,您可以将所有.so文件放在此文件夹中。这些文件实际上是否在APK中?您可以使用解压打开APK。这是一个问题-它们不在APK中。我可以将它们复制到assets文件夹,然后从特定文件夹加载libs(实际上,您的评论帮助我意识到了这一点,谢谢),但我希望以正确的方式进行。将来可能会这样。AssetStudio/gradle中不支持NDK。您是否尝试过使用Eclipse或Ant创建项目?由于某些原因,.so文件没有打包。如果您决定从assest文件夹复制文件,请确保使用java.lang.Runtime.load并提供完整路径。谢谢,我在其他问题中看到了这一点,但我的情况有点不同(我使用maven)。如果是我的代码,我会将代码更改为使用完整路径加载库。我可以使用这个库并更改源代码,然后我必须在将来花费时间来采用我对更新版本所做的更改。至于Eclipse——我宁愿使用vim而不是Eclipse。不,我还没试过用它来建房子。我意识到问题在于IntellijIDEA@Frohnzie,我将尝试通过“资源”文件夹连接库。我稍后再做。如果我成功了,让我们想办法奖励你的评论。它引导我找到了解决方案。谢谢你的回答,它帮助了我。我仍然不能相信我错过了“nativeLibrariesDirectory”一行,它只是指向了错误的目录。我的解决方法是在启动时将库从assets文件夹复制到自定义文件夹(否则这些文件没有路径),并将路径发送到sqlcipher,以便它从自定义文件夹加载库的副本(为此,我需要先重写调用函数)。该死,真不敢相信解决方案会这么简单。@ben75这能让你替换或更改现有的系统库吗?我之所以这样问,是因为可以替换这3个文件(libaudio.so、libaudioflinger.so、libaudiopolicy.so),以便在通话两端进行语音通话录音。Android目前在语音记录方面存在问题。某些设备(使用自定义ROM修改)允许语音录制。但是,如果我们能找到一种方法来替换任何android设备上的这3个文件,这将是一个巨大的突破,因为有数千名android用户想要录制电话,但根本无法做到。@Pierre我认为不通过根设备修改系统库是不可能的。(这篇文章与apk/用户“私有”的本机库有关)@ben75是否可以通过更改配置排除/libs目录中的文件?我的问题是:我很感激你的回答,但请看看ben75的答案answer@Ruzard是的,就这样。我在这里的方式更像是对黑客的描述。ben75告诉你真实的方式。还有一天,我们睡觉的时候比醒来的时候更聪明:)