需求 Android 通过 jni调用符合jni标准的c库,c库又需要调用第三方库
Android studio标准流程如下
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "test.hippo.com.testsmall"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "libgl2jni"
abiFilters "armeabi", "armeabi-v7a"
ldLibs "log", "GLESv2", "GLESv1_CM","avformat-ljy","avutil-ljy","swscale-ljy","swresample-ljy","OpenSLES","android","gnustl_shared","asdgnustl_shared"
cFlags "-DANDROID -DAES_ENCRYPT -Os"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs/armeabi']
jni.srcDirs=['src/main/jni/include','src/main/ffmpeg/include','src/main/fec/include','src/main/aes','src/main/jni']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
android 自带的log和GLESv2都能找到,并且正常,但是后面的ffmpeg都找不到,修改了 jniLibs.srcDirs 都找不到,又不能修改LDFLAGS修改默认的寻找路径,直接修改build/intermediates/ndk/android.mk也没用,每次编译后都会被AS重新生成
后来网上找了自己使用Android.mk的方法顺利通过了编译
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "test.hippo.com.testsmall"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
// ndk{
// moduleName "libgl2jni"
// abiFilters "armeabi", "armeabi-v7a"
// ldLibs "log", "GLESv2", "GLESv1_CM","avformat-ljy","avutil-ljy","swscale-ljy","swresample-ljy","OpenSLES","android","gnustl_shared","asdgnustl_shared"
// cFlags "-DANDROID -DAES_ENCRYPT -Os"
// }
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs/armeabi']
//jni.srcDirs=['src/main/jni/include','src/main/ffmpeg/include','src/main/fec/include','src/main/aes','src/main/jni']
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn 'ndkBuild','copyThirdso', 'copyJniLibs'
}
}
task ndkBuild(type: Exec) {//设置新的so的生成目录
def ndkBuildingDir = project.plugins.findPlugin('com.android.application').sdkHandler.getNdkFolder().absolutePath
commandLine ndkBuildingDir + "/ndk-build.cmd", '-C', 'src/main/jni',
"NDK_OUT=$buildDir/intermediates/ndk/obj",
"NDK_APP_DST_DIR=$buildDir/intermediates/ndk/libs/\$(TARGET_ARCH_ABI)"
}
task copyJniLibs(type: Copy) {//将新生成的so拷贝到jniLibs目录
from fileTree(dir: file(buildDir.absolutePath + '/intermediates/ndk/libs'), include: '**/*.so')
into file('src/main/jniLibs')
}
task copyThirdso(type: Copy) {//将第三方的so拷贝到jniLibs目录
from file('src/main/jni/libs')
into file('src/main/jniLibs')
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
把jni.srcDir设置为空,增加下面方法就可以通过android.mk来实现了
后来发现打包so没有打进去,修改为
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "test.hippo.com.testsmall"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
/*
ndk{
moduleName "libgl2jni"
abiFilters "armeabi", "armeabi-v7a"
ldLibs "log", "GLESv2", "GLESv1_CM"
//cFlags "-DANDROID -DAES_ENCRYPT -Os"
}
*/
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
// 1. 配置在根目录libs下可以加载第三方so库, (最好不要创建jniLibs, 在众多的开源库中可能会引起冲突,还没发现)
// 2. 运行时会自动将libs目录下的so库拷贝到指定目录
// 3. 如果自己创建的so不需要重新编译,可以将(app/build/intermediates/transforms)生成的so拷贝到这个目录
jni.srcDirs = []
jniLibs.srcDirs = ['libs/armeabi','libs/armeabi-v7a']
//jni.srcDirs = ['src/main/jni']
// 如果是单个文件夹 可以直接这样如下配置
// jniLibs.srcDir 'libs'
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn 'ndkBuild','copyThirdso','copyThirdsov7a', 'copyJniLibs','nativeLibsToJar'
}
}
task ndkBuild(type: Exec) {//设置新的so的生成目录
def ndkBuildingDir = project.plugins.findPlugin('com.android.application').sdkHandler.getNdkFolder().absolutePath
commandLine ndkBuildingDir + "/ndk-build.cmd", '-C', 'src/main/jni',
"NDK_OUT=$buildDir/intermediates/ndk/obj",
"NDK_APP_DST_DIR=$buildDir/intermediates/ndk/libs/\$(TARGET_ARCH_ABI)"
}
task copyJniLibs(type: Copy) {//将新生成的so拷贝到jniLibs目录
from fileTree(dir: file(buildDir.absolutePath + '/intermediates/ndk/libs'), include: '**/*.so')
into file('src/main/jniLibs')
}
task copyThirdsov7a(type: Copy) {//将第三方的so拷贝到jniLibs目录
from file('src/main/jni/libs')
into file('src/main/jniLibs/armeabi-v7a')
}
task copyThirdso(type: Copy) {//将第三方的so拷贝到jniLibs目录
from file('src/main/jni/libs')
into file('src/main/jniLibs/armeabi')
}
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from ('src/main/jniLibs')
into "lib"
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}