JNI and Gradle in Android Studio读书笔记

【一】
    Gradle Build Tools 2.2.0+ - The closest the NDK has ever come to being called 'magic'
    In trying to avoid experimental and frankly fed up with the NDK and all its hackery I am happy that 2.2.x of the Gradle Build Tools came out and now it just works. The key is the externalNativeBuildand pointing ndkBuild path argument at an Android.mk or change ndkBuild to cmake and point the path argument at a CMakeLists.txt build script.
    android {
    compileSdkVersion 19
    buildToolsVersion "25.0.2"
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19
    ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'x86'
        }
    externalNativeBuild {
            cmake {
                cppFlags '-std=c++11'
                arguments '-DANDROID_TOOLCHAIN=clang',
                        '-DANDROID_PLATFORM=android-19',
                        '-DANDROID_STL=gnustl_static',
                        '-DANDROID_ARM_NEON=TRUE',
                        '-DANDROID_CPP_FEATURES=exceptions rtti'
            }
        }
    }
    externalNativeBuild {
        cmake {
             path 'src/main/jni/CMakeLists.txt'
        }
        //ndkBuild {
        //   path 'src/main/jni/Android.mk'
        //}
    }
}
    For much more detail check Google's page on adding native code.
    After this is setup correctly you can ./gradlew installDebug and off you go. You will also need to be aware that the NDK is moving to clang since gcc is now deprecated in the Android NDK.
    Android Studio Clean and Build Integration - DEPRECATED
    The other answers do point out the correct way to prevent the automatic creation of Android.mk files, but they fail to go the extra step of integrating better with Android Studio. I have added the ability to actually clean and build from source without needing to go to the command-line. Your local.properties file will need to have ndk.dir=/path/to/ndk
    apply plugin: 'com.android.application'
    android {
    compileSdkVersion 14
    buildToolsVersion "20.0.0"
    defaultConfig {
        applicationId "com.example.application"
        minSdkVersion 14
        targetSdkVersion 14
    ndk {
            moduleName "YourModuleName"
        }
    }
    sourceSets.main {
        jni.srcDirs = [] // This prevents the auto generation of Android.mk
        jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
    }
    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir/ndk-build",
                '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
                '-j', Runtime.runtime.availableProcessors(),
                'all',
                'NDK_DEBUG=1'
    }
    task cleanNative(type: Exec, description: 'Clean JNI object files') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir/ndk-build",
                '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
                'clean'
    }
    clean.dependsOn 'cleanNative'
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }
}
    dependencies {
    compile 'com.android.support:support-v4:20.0.0'
}
    The src/main/jni directory assumes a standard layout of the project. It should be the relative from this build.gradle file location to the jni directory.
    Gradle - for those having issues
    Also check this Stack Overflow answer.
    It is really important that your gradle version and general setup are correct. If you have an older project I highly recommend creating a new one with the latest Android Studio and see what Google considers the standard project. Also, use gradlew. This protects the developer from a gradle version mismatch. Finally, the gradle plugin must be configured correctly.
    And you ask what is the latest version of the gradle plugin? Check the tools page and edit the version accordingly.
    Final product - /build.gradle
    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    // Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2'
}
    // Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.0'
    // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
    allprojects {
    repositories {
        jcenter()
    }
}
    Make sure gradle wrapper generates the gradlew file and gradle/wrapper subdirectory. This is a big gotcha.
    ndkDirectory
    This has come up a number of times, but android.ndkDirectory is the correct way to get the folder after 1.1. Migrating Gradle Projects to version 1.0.0. If you're using an experimental or ancient version of the plugin your mileage may vary.
    
    来自 <http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio> 

【二】
    In my case, I'm on Windows and following the answer by Cameron above only works if you use the full name of the ndk-build which is ndk-build.cmd. I have to clean and rebuild the project, thenrestart the emulator before getting the app to work (Actually I imported the sample HelloJni from NDK, into Android Studio). However, make sure the path to NDK does not contain space.
    Finally, my build.gradle is full listed as below:
    apply plugin: 'com.android.application'
    android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "com.example.hellojni"
        minSdkVersion 4
        targetSdkVersion 4
    ndk {
            moduleName "hello-jni"
        }
    testApplicationId "com.example.hellojni.tests"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
    sourceSets.main {
        jni.srcDirs = [] // This prevents the auto generation of Android.mk
//        sourceSets.main.jni.srcDirs = []
        jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
    }
    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        def ndkDir = android.plugin.ndkFolder
        commandLine "$ndkDir/ndk-build.cmd",
                '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
                '-j', Runtime.runtime.availableProcessors(),
                'all',
                'NDK_DEBUG=1'
    }
    task cleanNative(type: Exec, description: 'Clean JNI object files') {
        def ndkDir = android.plugin.ndkFolder
        commandLine "$ndkDir/ndk-build.cmd",
                '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
                'clean'
    }
    clean.dependsOn 'cleanNative'
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }
    }
    dependencies {
    compile 'com.android.support:support-v4:21.0.3'
}
    
    来自 <http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio> 
    
【参考】
    Install OpenGL ES and compile code for android
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值