Androidstudio导⼊含有jni代码依赖⼯程的eclipse项⽬及常见错
误解决
⾸先,将情景说明清楚:eclipse项⽬中除了主⼯程外还有⼀个依赖⼯程,且主⼯程跟依赖⼯程中都有jni代码,我们应该如何才能正确将其导⼊android studio且正常编译运⾏?怎么把项目导入到eclipse
下图为eclipse项⽬结构
其中sample_blur为主⼯程,CvFaceAPI-jni为依赖⼯程,都含有jni代码
⽹上有许多android studio导⼊eclipse项⽬的步骤,按照这篇教程来即可,
按照其第⼆部分的⽤android studio导⼊,总结下就是将原project关闭,然后import eclipse项⽬,选中主⼯程,根据上⽂那我们选择导⼊的就是整个eclipse项⽬中的sample_blur,android studio会⾃动将依赖⼯程也导⼊
接下来指定好你之后该项⽬的存放路径
然后在这个地⽅注意,上⾯两个选项勾选上,最后⼀项不要勾选。
最后⼀项是将module名创建为camelCase风格,camelCase表⽰⾸字母⼩写的驼峰式风格,CamelCase表⽰⾸字母⼤写的驼峰式风格。
不勾选这个选项意味着你原先的⼯程名是啥样,转换完就是啥样。
点击finish等待转换,可能会有下列问题
1.        点击finish后⼀直处于building“project name”gradle project info
这是因为在线安装gradle包出现问题,解决⽅法:
查看gradle版本:查看⽬录C:\Users\⽤户名\.gradle\wrapper\dists\gradle-1.XX-all
存放位置:C:\Users\⽤户名\.gradle\wrapper\dists\gradle-1.XX-all\3jdgemv0iv8uqohg3kcp2o88r1\gradle-1.XX-all.zip
知道了版本,知道了位置,剩下的就是在⽹上下载离线包了,⾕歌或者百度搜索gradle-1.XX-all.zip,下载完毕后直接把zip拷贝到
C:\Users\⽤户名\.gradle\wrapper\dists\gradle-1.XX-all\3jdgemv0iv8uqohg3kcp2o88r1\ 下。重启AndroidStudio后,打开项⽬即可。
2.        Could not determine thedependencies of task ':hellojni:compileArmDebugJava'.
> failed to find Build Tools revision 19.0.3
解决⽅法:这个Build Tools是指“Android SDK Build-tools”,打开SDK Manager勾选对应版本号(⽐如这⾥是19.0.3)安装就可以。
3.        项⽬⽆法运⾏,run按钮是灰⾊的
解决⽅法:adb环境变量没有配置,只要将adb的路径配置环境变量到path⾥⾯就好了
4.        Error: Your project containsC++ files but it is not using a supported native build system
解决⽅法:
在adle(Module:app) 中添加
sourceSets {
main {
jni.srcDirs = []
}
}
buildTypes{
}
同时添加 android.useDeprecatedNdk=true 在你的 gradle.properties中
jni.srcDirs = []    //这⼀句是禁⽤gradle默认的ndk-build,防⽌AS⾃⼰⽣成android.mk编译jni⼯程
(sourceSets是⽤来更改android的默认⽬录结构)
5.        So动态库⽆法载⼊
解决⽅法:没有对原项⽬的jni进⾏编译,依赖⼯程或者主⼯程要⽤到的so都需要编译。根据上⾯第四点提到的sourceSets,如果想根据eclipse的习惯将so⽂件放在libs中(android studio默认放在jniLibs中),我们可以在sourceSets的main函数中加⼊jniLibs.srcDirs = ['src/main/libs']
jniLibs.srcDirs = ['src/main/libs']    //这⼀句是设置⽬标的so存放路径,也就是组装到apk中的so路径
如果你的jni代码是在src/main/jni中,还可以设置jni.srcDirs = ['jni']
最后我们在android studio的终端进⼊到你所需要编译的依赖⼯程或者主⼯程的jni⽬录进⾏ndk-build,build成功后才会⽣成我们需要的so⽂件
这⾥注意要配置好ndk的环境路径,以及项⽬所指向的ndk路径是否正确
6.        java.lang.UnsatisfiedLinkError:
ls.fd.runtime.IncrementalClassLoader$DelegateClassLoadernativeLibraryDirectories= [XXXXXXXXXXXXXXXXXXXXXXXXXXX,/system/arm64]]]couldn't find "libmp3lame.so"
错误问题在于UnsatisfiedLinkError以及后⾯出现的arm64 couldn’t find  ***.so
我们可以理解为不到so⽂件,这⾥是存放.so的⽬录有问题,如上⾯出现的arm64 couldn’t find就是因为没有arm64这个⽂件夹,只有armeabi和armeabi-v7a,新建arm64⽂件夹可以编译通过,但还是需要该so能⽀持64位处理器,否则程序运⾏也会出错。
arm64-v8a是可以向下兼容的,其下有armeabi-v7a,armeabi ;armeabi-v7a向下兼容armeabi。对于⼀个cpu是arm64-v8a架构的⼿机,它运⾏app时,进⼊jnilibs去读取库⽂件时,先看有没有arm64-v8a
⽂件夹;如果没有该⽂件夹,去armeabi-v7a⽂件夹,如果没有,再去armeabi⽂件夹,如果连这个⽂件夹也没有,就抛出异常
如果有arm64-v8a⽂件夹,那么就去特定名称的.so⽂件,注意:如果没有到,不会再往下(armeabi-v7a⽂件夹)了,⽽是直接抛出异常。
⽽依赖module引⼊的so库必须存放在该modle本⾝的jniLib⽬录下,⽽不能放⼊app Module的库⽬录中,否则报错。
所以要不就是为依赖module提供可以处理64位处理器的so,要不就除去app module⽬录下的arm64,依赖module中的结构保持不变,使得系统在加载so库的时候直接到armeabi-v7a中寻。
7.        Error:
Could not install Gradle distribution from‘https:/ //distributions/gradle-2.2.2-all.zip’.
字⾯意思是现在不到也安装不了这个版本的gradle
解决⽅法:先进到Gradle的设置页⾯ Settings-Build, Execution, Deployment-Gradle
选择⽤本地的Gradle插件并输⼊路径
之后还会报错:
Error:(2, 0) No service of type Factoryavailable in ProjectScopeServices.
这个错误点击open file 会跳转到apply plugin: ‘com.github.dcendents.Android-maven’这⾏。
这时候你需要更新maven-plugin的依赖将这两⾏代码添加到dependencies{} 依赖标签内
classpath'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath'ls.build:gradle:2.2.2'
8.        有时候clean下项⽬也能解决⼀些奇奇怪怪的问题
9.        Error:Execution
failed for task':FaceGroupSample:transformNative_libsWithStripDebugSymbolForDebug'. >java.lang.NullPointerException (no error message)
解决⽅法:空指针异常,说是studio升级到2.2后的Bug
进 local.properties 中把 ndk.dir 直接删除禁⽤,然后clean–rebuild 就可以了
10.    编译ndk时出现错误
Android NDK: Aborting (set APP_ALLOW_MISSING_DEPS=true toallow missing dependencies)
只需要在jni⽬录中的android.mk中加⼊android.useDeprecatedNdk=true
回退ndk版本也可以,但是会失去⼀些可以使⽤的函数
11.    Build时出现Failed toresolve: de.findbugs:jsr305:2.0.1或者
Failed to resolve: junit:junit:4.12等
单纯的⽹络连接问题。解决办法就是将不需要的library去掉,将以下代码展⽰的库依赖去掉,重新编译即可将dependencies中下列依赖去掉
compilefileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.st.espresso:espresso-core:2.2.2',{
exclude group: 'com.android.support',module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
testInstrumentationRunner "st.runner.AndroidJUnitRunner"
12.    待更新。。。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。