转载来自:http://blog.csdn.net/wcz1128/article/details/54574051
Android studio jni内调用第三方so
需求 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'
- }