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'
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值