每次吃一点AndroidのNDK&JNI

作者: 耑意儿 | 来源:发表于2017-03-20 08:47 被阅读71次
    目录:
    1、初识NDK&JNI
    2、.so文件的两种生成方式
    

    Android小仙

    1. 初识NDK&JNI

    1.1. 基础概念

    JNI(Java Native Interface):java本地接口,指用C/C++开发的接口。支持Java语言与其他语言(通常是C/C++)沟通的机制
    NDK(Native Development Kit):支持C/CPP(即C++)原生开发的一套工具集,支持将.so文件和java一起打包成apk
    什么是.so文件?
    so(Share Object)是实现了Java层定义的native接口的动态库。在安卓系统下将C/C++程序打包后生成的文件。这个.so文件不像.class字节码文件那样容易被反编译,因此安全性比较好。

    1.2. 为什么学NDK,NDK有啥子用?

    • 实现代码保护,实现安全性。我们都知道JAVA容易被反编译,那C/C++反编译的难度就大很多了
    • 方便使用开源库。很多是用C/C++写的
    • 借用内存。安卓为每个应用程序配了定量的内存,使用NDK可以借用更多系统内存,实现性能优化
    • 便于移植到其他平台上使用,很多嵌入式平台支持C/C++
    • 提高执行效率

    2. .so文件的两种生成方式

    • 命令行+Android.mk+Application.mk
    • AndroidStudio + NDK Gradle Plugin

    看第二种。
    app目录下的build.gradle文件说明

     // 1. CFlags和cppFlags都是可选配置
     // 2. CFlags和cppFlags都是用于指定额外的宏定义或者编译选项
     // 3. CFlags:同时生效于c和cpp源文件
    // 4. cppFlags:仅仅只生效于cpp源文件,并且是在CFlags之后生效
    // 5. 特别地:在android-ndk-1.5-r1
    // 1. CFlags仅仅只针对c源文件生效
    // 2. cppFlags同时生效于c和cpp源文件
       CFlags.add("-DCUSTOM_DEFINE")   // (可选)
       cppFlags.add("-DCUSTOM_DEFINE")   // (可选)在构建c++源文件的时候传入,在编译器构建命令行中最后出现
    
       ldFlags.add("-L/custom/lib/path")
    
       // 构建时,需要用到的额外链接库
       ldLibs.add("log")
    
       // 打包的时候,需要包含的标准库
       stl = "stlport_static"
    

    关于NDK Gradle Plugin的用户指南:Experimental Plugin User Guide,里面提供了gradle的配置说明

    apply plugin: "com.android.model.application"
    //无NDK:apply plugin: "com.android.application"
    
    // 未使用NDK时,没有model这一层
    model {
        android {
            compileSdkVersion  = 23
            buildToolsVersion  = "23.0.2"
    
    // 未使用NDK时,没有.with,没有=等号
            defaultConfig.with {
                applicationId "com.example.user.myapplication"
                minSdkVersion.apiLevel = 15
                targetSdkVersion.apiLevel = 22
                versionCode = 1
                versionName  = "1.0"
    
                buildConfigFields.with {
                    create() {
                        type "int"
                        name "VALUE"
                        value "1"
                    }
                }
            }
            buildTypes.with {
             release {
                 minifyEnabled false
                 proguardFiles.add(file("proguard-rules.pro"))
             }
         }
            productFlavors{
             create("flavor1") {
                 applicationId "com.app"
             }
         }
        
         // Configures source set directory.
         sources {
             main {
                 java {
                     source {
                         srcDir "src"
                     }
                 }
             }
         }
        }   
    }
    
    dependencies {
        compile fileTree(dir: "libs", include: ["*.jar"])
        compile "com.android.support:appcompat-v7:22.2.0"
    }
    

    上张对照图比较明显:


    红色部分为差异点

    参考资料

    Android NDK 开发入门指南
    JNI&NDK编程小结及建议
    极客学院JNI/NDK开发指南

    相关文章

      网友评论

        本文标题:每次吃一点AndroidのNDK&JNI

        本文链接:https://www.haomeiwen.com/subject/bbrvnttx.html