Android studio jni内调用第三方so

转载来自:http://blog.csdn.net/wcz1128/article/details/54574051

Android studio jni内调用第三方so

需求 Android 通过 jni调用符合jni标准的c库,c库又需要调用第三方库

Android studio标准流程如下

[cpp]  view plain  copy
  1. apply plugin: 'com.android.application'  
  2.   
  3. android {  
  4.     compileSdkVersion 23  
  5.     buildToolsVersion "24.0.2"  
  6.   
  7.     defaultConfig {  
  8.         applicationId "test.hippo.com.testsmall"  
  9.         minSdkVersion 15  
  10.         targetSdkVersion 23  
  11.         versionCode 1  
  12.         versionName "1.0"  
  13.         ndk{  
  14.             moduleName "libgl2jni"  
  15.             abiFilters "armeabi""armeabi-v7a"  
  16.             ldLibs "log""GLESv2""GLESv1_CM","avformat-ljy","avutil-ljy","swscale-ljy","swresample-ljy","OpenSLES","android","gnustl_shared","asdgnustl_shared"  
  17.             cFlags "-DANDROID -DAES_ENCRYPT -Os"  
  18.         }  
  19.     }  
  20.     buildTypes {  
  21.         release {  
  22.             minifyEnabled false  
  23.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  24.         }  
  25.     }  
  26.   
  27.     sourceSets {  
  28.         main {  
  29.             jniLibs.srcDirs = ['libs/armeabi']  
  30.             jni.srcDirs=['src/main/jni/include','src/main/ffmpeg/include','src/main/fec/include','src/main/aes','src/main/jni']  
  31.         }  
  32.     }  
  33.   
  34. }  
  35.   
  36.   
  37.   
  38. dependencies {  
  39.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  40.     testCompile 'junit:junit:4.12'  
  41.     compile 'com.android.support:appcompat-v7:23.4.0'  
  42. }  
android 自带的log和GLESv2都能找到,并且正常,但是后面的ffmpeg都找不到,修改了   jniLibs.srcDirs 都找不到,又不能修改LDFLAGS修改默认的寻找路径,直接修改build/intermediates/ndk/android.mk也没用,每次编译后都会被AS重新生成

后来网上找了自己使用Android.mk的方法顺利通过了编译

[cpp]  view plain  copy
  1. apply plugin: 'com.android.application'  
  2.   
  3. android {  
  4.     compileSdkVersion 23  
  5.     buildToolsVersion "24.0.2"  
  6.   
  7.     defaultConfig {  
  8.         applicationId "test.hippo.com.testsmall"  
  9.         minSdkVersion 15  
  10.         targetSdkVersion 23  
  11.         versionCode 1  
  12.         versionName "1.0"  
  13. //        ndk{  
  14. //            moduleName "libgl2jni"  
  15. //            abiFilters "armeabi", "armeabi-v7a"  
  16. //            ldLibs "log", "GLESv2", "GLESv1_CM","avformat-ljy","avutil-ljy","swscale-ljy","swresample-ljy","OpenSLES","android","gnustl_shared","asdgnustl_shared"  
  17. //            cFlags "-DANDROID -DAES_ENCRYPT -Os"  
  18. //        }  
  19.     }  
  20.     buildTypes {  
  21.         release {  
  22.             minifyEnabled false  
  23.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  24.         }  
  25.     }  
  26.   
  27.     sourceSets {  
  28.         main {  
  29.             jni.srcDirs = []  
  30.             jniLibs.srcDirs = ['libs/armeabi']  
  31.             //jni.srcDirs=['src/main/jni/include','src/main/ffmpeg/include','src/main/fec/include','src/main/aes','src/main/jni']  
  32.         }  
  33.     }  
  34.     tasks.withType(JavaCompile) {  
  35.         compileTask -> compileTask.dependsOn 'ndkBuild','copyThirdso''copyJniLibs'  
  36.     }  
  37.   
  38.   
  39. }  
  40.   
  41. task ndkBuild(type: Exec) {//设置新的so的生成目录  
  42.   
  43.     def ndkBuildingDir = project.plugins.findPlugin('com.android.application').sdkHandler.getNdkFolder().absolutePath  
  44.     commandLine ndkBuildingDir + "/ndk-build.cmd"'-C''src/main/jni',  
  45.             "NDK_OUT=$buildDir/intermediates/ndk/obj",  
  46.             "NDK_APP_DST_DIR=$buildDir/intermediates/ndk/libs/\$(TARGET_ARCH_ABI)"  
  47. }  
  48.   
  49. task copyJniLibs(type: Copy) {//将新生成的so拷贝到jniLibs目录  
  50.   
  51.     from fileTree(dir: file(buildDir.absolutePath + '/intermediates/ndk/libs'), include: '**/*.so')  
  52.     into file('src/main/jniLibs')  
  53. }  
  54.   
  55. task copyThirdso(type: Copy) {//将第三方的so拷贝到jniLibs目录  
  56.     from file('src/main/jni/libs')  
  57.     into file('src/main/jniLibs')  
  58. }  
  59.   
  60. dependencies {  
  61.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  62.     testCompile 'junit:junit:4.12'  
  63.     compile 'com.android.support:appcompat-v7:23.4.0'  
  64. }  

把jni.srcDir设置为空,增加下面方法就可以通过android.mk来实现了

后来发现打包so没有打进去,修改为
[cpp]  view plain  copy
  1. apply plugin: 'com.android.application'  
  2.   
  3. android {  
  4.     compileSdkVersion 23  
  5.     buildToolsVersion "24.0.2"  
  6.   
  7.     defaultConfig {  
  8.         applicationId "test.hippo.com.testsmall"  
  9.         minSdkVersion 15  
  10.         targetSdkVersion 23  
  11.         versionCode 1  
  12.         versionName "1.0"  
  13. /* 
  14.         ndk{ 
  15.             moduleName "libgl2jni" 
  16.             abiFilters "armeabi", "armeabi-v7a" 
  17.             ldLibs "log", "GLESv2", "GLESv1_CM" 
  18.             //cFlags "-DANDROID -DAES_ENCRYPT -Os" 
  19.         } 
  20.         */  
  21.   
  22.     }  
  23.     buildTypes {  
  24.         release {  
  25.             minifyEnabled false  
  26.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  27.         }  
  28.     }  
  29.   
  30.     sourceSets {  
  31.         main {  
  32.             // 1. 配置在根目录libs下可以加载第三方so库, (最好不要创建jniLibs, 在众多的开源库中可能会引起冲突,还没发现)  
  33.             // 2. 运行时会自动将libs目录下的so库拷贝到指定目录  
  34.             // 3. 如果自己创建的so不需要重新编译,可以将(app/build/intermediates/transforms)生成的so拷贝到这个目录  
  35.             jni.srcDirs = []  
  36.             jniLibs.srcDirs = ['libs/armeabi','libs/armeabi-v7a']  
  37.             //jni.srcDirs = ['src/main/jni']  
  38.             // 如果是单个文件夹 可以直接这样如下配置  
  39.             // jniLibs.srcDir 'libs'  
  40.         }  
  41.     }  
  42.   
  43.     tasks.withType(JavaCompile) {  
  44.         compileTask -> compileTask.dependsOn 'ndkBuild','copyThirdso','copyThirdsov7a''copyJniLibs','nativeLibsToJar'  
  45.     }  
  46.   
  47.   
  48.   
  49. }  
  50.   
  51. task ndkBuild(type: Exec) {//设置新的so的生成目录  
  52.   
  53.     def ndkBuildingDir = project.plugins.findPlugin('com.android.application').sdkHandler.getNdkFolder().absolutePath  
  54.     commandLine ndkBuildingDir + "/ndk-build.cmd"'-C''src/main/jni',  
  55.             "NDK_OUT=$buildDir/intermediates/ndk/obj",  
  56.             "NDK_APP_DST_DIR=$buildDir/intermediates/ndk/libs/\$(TARGET_ARCH_ABI)"  
  57. }  
  58.   
  59. task copyJniLibs(type: Copy) {//将新生成的so拷贝到jniLibs目录  
  60.   
  61.     from fileTree(dir: file(buildDir.absolutePath + '/intermediates/ndk/libs'), include: '**/*.so')  
  62.     into file('src/main/jniLibs')  
  63. }  
  64.   
  65. task copyThirdsov7a(type: Copy) {//将第三方的so拷贝到jniLibs目录  
  66.     from file('src/main/jni/libs')  
  67.     into file('src/main/jniLibs/armeabi-v7a')  
  68. }  
  69.   
  70. task copyThirdso(type: Copy) {//将第三方的so拷贝到jniLibs目录  
  71.     from file('src/main/jni/libs')  
  72.     into file('src/main/jniLibs/armeabi')  
  73. }  
  74.   
  75. task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {  
  76.     destinationDir file("$projectDir/libs")  
  77.     baseName "Native_Libs2"  
  78.     extension "jar"  
  79.     from ('src/main/jniLibs')  
  80.     into "lib"  
  81. }  
  82.   
  83. dependencies {  
  84.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  85.     testCompile 'junit:junit:4.12'  
  86.     compile 'com.android.support:appcompat-v7:23.4.0'  
  87. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值