Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本机库(.so文件)未添加到android项目中_Android_Maven_Android Studio_Intellij Idea_Unsatisfiedlinkerror - Fatal编程技术网

本机库(.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告诉你真实的方式。还有一天,我们睡觉的时候比醒来的时候更聪明:)