学习ndk开发,上课的demo项目是eclipse的,需要将eclipse的项目一直到Android Studio,发现带JNI和so的文件移植起来需要改很多配置,花费了很长的时间,照着网上的文章博客修改,发现很多博客要么就是写了不是很清晰,对于我这种渣渣新手看了仍然很晕,所以自己移植成功后记录一下,加强理解。
环境
Android Studio是3.2.0。首先用Android Studio选FIle,import Project
选择要导入的eclipse项目
点击OK
为了方便这些选项都可以默认
创建完成时候,显示的import-summary.txt是你操作的日志,bug或者变更都可查看下。
发现此时build报错,原因Could not find com.android.tools.build:gradle:3.2.1.后续新版AS没这问题了,解决方法我这里是在build.gradle,都加入google()方法,如图:
重新build,这时又报错
Manifest merger failed : uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library [com.android.support:support-v4:25.3.1] C:\Users\yrq\.gradle\caches\transforms-1\files-1.1\support-v4-25.3.1.aar\ac8b385265bb5dcb256b7626452cf3b1\AndroidManifest.xml as the library might be using APIs not available in 8
Suggestion: use a compatible library with a minSdk of at most 8,
or increase this project's minSdk version to at least 9,
or use tools:overrideLibrary="android.support.v4" to force usage (may lead to runtime failures)
最低版本太低,将 build.gradle最低版本改成你支持的最低版本,不知道可以新建个项目去该项目此文件夹查看,我这里把compileSdkVersion等一起都改成了我默认的。如图
重新编译发现又有这个错
发现出错您的项目包含c++文件,但它不使用受支持的本地构建系统 ,解决方法,在gradle.properties加入
Android.useDeprecatedNdk=true
如图
build.gradle的buildTypes函数加入方法
sourceSets {
main {
jni.srcDirs = ['libs']//设置禁止gradle生成Android.mk
}
}
如图
build一下,然后此时右键app文件夹
选择Link C++ Project with Gradle(不知道为什么不做之前2步添加sdk和添加上面的函数,再build就看不见这个选项),有两种ndk-build和Cmake方法,我用第一个,选择自己的Android.mk(感觉就像c的Makefile),然后选择自己项目的这个文件所在。点ok重新build了。
接着又出现错误
一个错我理解是老版本的关键词和新版本关键词用的不一样,改变成提示的,compile改成dependencies,如下图
另一个错估计提示说最低版本那些东西不应该放在AndroidManifest.xml这个配置文件中,找到这个文件把写最低版本的信息删了,如图
然后重新build。不再报错,然后run。发现又报错。如下
More than one file was found with OS independent path 'lib/x86_64/libtest_cpp.so'
网上说原因是依赖有多个名称不同,但是功能相同的library,在项目根目录下搜一下就可以发现多个如libstlport_shared.so'的同名文件,解决方法是在android加个代码
packagingOptions {//加上这些代码
pickFirst 'lib/armeabi-v7a/libtest_cpp.so'//注意最后的名字跟你项目来写,下面几行也是
pickFirst 'lib/armeabi-v8a/libtest_cpp.so'
pickFirst 'lib/arm64-v8a/libtest_cpp.so'
pickFirst 'lib/x86/libtest_cpp.so'
pickFirst 'lib/x86_64/libtest_cpp.so'
}
如图加进去,加到之前加方法的那个android里面
编译运行
运行成功。至此移植成功。
总结
即使移植成功,但是很多步骤还是不太理解为什么报这错,还有要好好加强学习,后面是比较好的参考博客。