我对这整个Gradle和Android Studio支持都很陌生.我已设法使用导出选项将我的android项目转换为gradle.
但我正在寻找一些文档或开始如何将NDK构建集成到gradle构建过程中.
如果可能的话,我还需要某种"后"阶段,将构建二进制文件(.so文件)复制到资产目录.
我阅读了许多线程如何将*.so库添加到Android Studio,但它们都不起作用,特别是当涉及到文本点时:这不适用于较新的xxx(Android Studio,gradle,...)
我们能否重新开始吧.我有:
Android Studio 0.6.0
从项目结构我看到:
SDK位置:
/usr/share/android-studio/data/sdk
/usr/lib/jvm/default-java
Run Code Online (Sandbox Code Playgroud)
项目:
Gradle version 1.10
Android Plugin Version 0.11.+
Run Code Online (Sandbox Code Playgroud)
模块/应用程序:属性:
编译Sdk版本19构建工具版本19.1.0
依赖关系:
{dir=libs, include=[*.jar]} Compile
{dir=libs, include=[*.so]} Provided
m com.android.support: appcompat -v7:19.+ Compile
Run Code Online (Sandbox Code Playgroud)
我得到了预先编译的*.so文件,并且在演示应用程序中它们正在运行.我必须更改应用程序的源代码,因此我需要使用相同的*.so文件进行重建.
我正在尝试添加一个外部库,Scandit.我一直收到这个错误:
java.lang.UnsatisfiedLinkError: Couldn't load scanditsdk-android-3.3.1 from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.clover.barcode2-1.apk,libraryPath=/data/app-lib/com.clover.barcode2-1]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:365)
.....
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我没有正确包含库附带的.so文件,但我无法弄清楚如何做到这一点.
我正在使用Android Studio,我通过转到模块设置 - >库添加了库,并添加了带有jar的目录和带有so文件的目录.
我希望包含一个在我的Android Studio NDK项目中预编译的静态库.我正在使用Android Studio 1.0.1,任何在SO上尝试此问题的解决方案似乎已过时(或涉及创建库项目并包含它).
结构如下:
app
/--src
/--main
/--java
+--jni
+--jniLibs
/--armeabi
/--libpng.a
--armeabiv7
/--libpng.a
...(for each abi)
Run Code Online (Sandbox Code Playgroud)
我试图包括库libpng.我尝试创建jniLibs(根据ph0b(awesome guide,btw)并将libpng.a添加到相应的ABI文件夹.这仍然给我错误 - 当我尝试使用以下代码编译时找不到-llibpng:
ndk {
moduleName "game"
cFlags "-std=c++11 -fexceptions -DANDROID -I${project.buildDir}/../src/main/jni/include \
-I${project.buildDir}/../src/main/jni/include/png"
ldLibs "EGL", "GLESv3", "dl", "log", "android", "libpng"
stl "gnustl_static"
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将JavaCV与Android Studio和Gradle一起使用.我写了这样的代码片段:
repositories {
mavenCentral()
maven {
url "http://maven2.javacv.googlecode.com/git/"
}
}
dependencies {
compile files('libs/android-support-v4.jar')
compile group: 'com.googlecode.javacpp', name: 'javacpp', version: '0.5'
compile group: 'com.googlecode.javacv', name: 'javacv', version: '0.5'
}
Run Code Online (Sandbox Code Playgroud)
我在dir外部库中看到了导入的库.所以我试着运行这个:
...
IplImage zdjecie=cvLoadImage(Environment.getExternalStorageDirectory().getPath()+ "/1.bmp");
cvSaveImage(Environment.getExternalStorageDirectory().getPath()
+ "/2.bmp", zdjecie);
...
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load jniopencv_core: findLibrary returned null
Run Code Online (Sandbox Code Playgroud)
...因为我不知道我应该怎么处理opencv(和其他人).so文件.
那么我们应该如何在Android Studio中使用JavaCV?
很久以后,在Android Gradle插件0.7.3中添加了在Android项目中添加预先构建的.so文件的支持.但与我不同的是,很多人仍在使用hack/workaround添加预先构建的.so文件,即使用特定层次结构压缩文件,然后重命名为.jar.以下是如何正确添加.so文件的分步指南.
在Android Studio 0.6中,我创建了一个android测试项目,其中包含一个用JNI包装的非常简单的C函数.我订android:debuggable="true"了AndroidManifest.xml.
我跑ndk-build NDK_DEBUG=1.这会在正确的位置生成一个gdbserver和一个gdb.setup文件.

但是,当我在Android studio中构建项目时,ndk-gdb --debug我得到了以下输出:
Android NDK installation path: /usr/local/android-ndk-r9d
Using default adb command: /Applications/Android Studio.app/sdk/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.31
Using ADB flags:
Using JDB command: /usr/bin/jdb
Using auto-detected project path: .
Found package name: com.example.testndk.app
ABIs targetted by application: armeabi-v7a
Device API Level: 19
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi-v7a
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup
Using toolchain …Run Code Online (Sandbox Code Playgroud) android android-ndk ndk-gdb android-studio android-gradle-plugin
我正在尝试使用需要使用本机库的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)
Run Code Online (Sandbox Code Playgroud)
它意味着.so文件在编译期间没有附加.
所有3个文件都存储在/ libs/armeabi /目录中.
我认为问题在于我使用maven来管理依赖项(无论如何都要使用Android Studio进行构建).下一次尝试 - 将这些库包含在maven依赖项中.根据文档,这很容易.我在公共存储库中找不到它们,所以我使用<scope>system</scope>
了标签.它们是可见的,但它不起作用.后来发现这个链接,据说范围"系统"不起作用,尝试将这些库添加到本地存储库中使用
mvn install:install-file -DgroupId=net.sqlitecipher -DartifactId=stlport_shared -Dversion=1.0 -Dfile=libstlport_shared.so -Dpackaging=so -DgeneratePom=true
Run Code Online (Sandbox Code Playgroud)
最后 - 它没有用.
我也看到了这个话题,可能这是一个解决方案,但我目前不使用gradle.有没有办法将.so文件包含到apk中,而无需从maven转移到gradle?
据我所知,Android Studio在内部使用gradle来构建apks,所以我对maven的所有努力都没用,直到他们开始支持本机库,我是对的吗?我还尝试用Intellij IDEA Cardea(13.0)构建项目,遗憾的是没有任何成功.
android intellij-idea maven unsatisfiedlinkerror android-studio
我们有这个加载本机库的应用程序,这个库提供了我们调用的本机方法.在某些手机(特别是较慢的手机)上,这会导致问题.每当(我认为)库仍在"加载"并且过早地调用方法时,就会发生UnsatisfiedLinkError.
有办法处理这个问题吗?就像检查库是否已经加载一样.
所以我从https://github.com/libpd/pd-for-android获得了git repo,并在Android Studio中为我的"AmazingSynthesizer"创建了一个新的空白项目.
我使用"导入模块"向导导入PdCore和AndroidMidi.然后,右键单击"app"查看我的"模块设置".在依赖项下,我添加了PdCore作为模块依赖项.另外,我添加了AndroidMidi作为"PdCore"的模块依赖项.
到目前为止,这对我来说似乎是正确的.我的应用程序的build.gradle包含库,我可以在MainActivity中导入PdDispatcher.问题是,它似乎仍然错过了本机库(我想!).
官方libpd书中的基本示例代码(由Peter Brinkmann制作音乐应用程序)
PdAudio.initAudio(sampleRate, 0, 2, 8, true);
Run Code Online (Sandbox Code Playgroud)
悲惨地失败了
java.lang.UnsatisfiedLinkError: Couldn't load pd from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.app.amazingsynthesizer-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.app.amazingsynthesizer-1, /vendor/lib, /system/lib]]]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:358)
at java.lang.System.loadLibrary(System.java:526)
at org.puredata.core.PdBase.<clinit>(PdBase.java:55)
at org.puredata.android.io.PdAudio.startAudio(PdAudio.java:86)
at com.app.amazingsynthesizer.MainActivity.onResume(MainActivity.java:62)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
at android.app.Activity.performResume(Activity.java:5310)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2764)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)