理解.SO文件
首先,应用程序的二进制接口(Application Binary Interface)定义了二进制文件如何在相应的平台上运行。即,ABI定义了.so文件的运行方式。
而,不同的CPU架构,对应不同的ABI:
CPU:ARMv5 ==> ABI:armeabi
CPU:ARMv7 ==> ABI:armeabi-v7a
CPU:ARMv8 ==> ABI:arm64-v8a
CPU:x86 ==> ABI:x86
CPU:x86_64 ==> ABI:x86_64
CPU:MIPS ==> ABI:mips
CPU:MIPS64 ==> ABI:mips64
另外,ARMv8和x86的设备都可以运行armeabi和armeabi-v7a的.so文件。但是会降低CPU性能或者可能程序报错。
NDK是向前兼容,所以编译生成.so文件是用最小platform(app中minSdkVersion)来编辑.
所以,需要针对不同CPU架构配置不同的.so文件。
简介:
1、配置NDK。Android Studio在File-->Project Structure中配置NDK路径。在app/build.gradle中defaultConfig中添加ndk{moduleName "PatchJNI"}。
2、声明native方法。如:com/example/app/utils/Patch.java中声明native方法。紧接着build下工程。
3、生成头文件。Termimal中输入如下命令。注意目录位置。会在当前目录下自动创建一个jni文件夹,并在jni文件夹内生成头文件。
命令:javah -d jni -classpath ...sdk\platforms\android-19\android.jar;..\..\build\intermediates\classes\debug(空格)com.example.app.utils.Patch
4、复制头文件的方法,新建任意文件名的C文件,并用C实现该方法。
5、在jni目录先创建Android.mk和Application.mk。
6、定义.so文件生成目录。在app/build.gradle中与defaultConfig同级,添加sourceSets.main{jni.srcDirs = [] jniLibs.srcDir 'src/main/libs'},将会在src/main下创建libs并在libs中生成相应ABI的.so目录及文件。
7、执行ndk-build.cmd命令。先定位到ndk目录,然后执行ndk-build.cmd命令。然后就会生成.so文件。