• Android Studio NDK开发入门


    从Android Studio 1.3 Beta1开始,就支持了NDK,我目前使用的版本是1.5.首先强调几点。

    1.必须安装NDK并配置好环境变量(和配置JDK环境变量如出一辙:新建NDK_HOME我的变量值为D:android-sdk-windows dk-bundle

    在Path变量最后加上;%NDK_HOME%)

    2.目前的NDK只支持gradle2.5,版本高了或低了都不行(后面还会说到)

    接下来我通过实际建立一个工程赖演示NDK在Android Studio中的用法。我会一步一步的来,方便大家学习。

    我们首先向平时一样建立一个空的项目模板,修改设置,设置Gradle版本为2.5


    接下来我们需要将根目录下的gradle修改为实验性的gradle如下所示:

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle-experimental:0.2.0'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    因为需要gradle2.5的支持,我们需要需要将gradle/gradle-wrapper.properties中的版本修改为2.5,如下所示:

    #Wed Oct 21 11:34:03 PDT 2015
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https://services.gradle.org/distributions/gradle-2.5-all.zip
    然后到了最容易出错的地方:修改原来的app/build.gradle,如下所示:

    apply plugin: 'com.android.model.application'//这里加上.model
    //在android{......}外面加上一层model{},
    // 将android{......}中的buildTypes移动到android{}外面,但在model{}里面。
    //对buildTypes做一些修改
    //在android{}里面添加一个task.withType(JavaCompile){......}
    //在model{}里面添加一个android.ndk{......}
    //删除dependencies{......}中的testCompile 'junit:junit:4.12'
    //最后要注意等于号要一一对应,不要漏写
    model {
        android {
            compileSdkVersion = 23
            buildToolsVersion = "23.0.3"
    
            defaultConfig.with {
                applicationId = "com.ndkexample"
                minSdkVersion.apiLevel = 14
                targetSdkVersion.apiLevel = 23
                versionCode = 1
                versionName = "1.0"
            }
            task.withType(JavaCompile) {
                //指定编译JDK版本
                sourceCompatibility = JavaVersion.VERSION_1_7
                targetCompatibility = JavaVersion.VERSION_1_7
            }
        }
        android.ndk {
            moduleName = "ndkexample"//这个是将来生成的so文件的名称,可任意取
            ldLibs += "log"//引入打印日志信息的包
            //支持armeabi,armeabi-v7a,x86三个平台
            abiFilters += "armeabi"
            abiFilters += "armeabi-v7a"
            abiFilters += "x86"
        }
        android.buildTypes {
            release {
                minifyEnabled false
                proguardFiles += file('proguard-rules.pro')
            }
        }
    }
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        /*testCompile 'junit:junit:4.12'*///这一行删去
        compile 'com.android.support:appcompat-v7:23.4.0'
    }
    

    此处可以编译一下,看看是否出错,如果出错请仔细核对是否字符错误或包名没有改成你自己的。

    据Google官网上说在官网上说,因为NDK还是实验版,不得已才让用户自己改代码,他们会逐渐让这些东西自动化。

    在app/src/main文件夹上点右键,在弹出菜单中选择“New”、“Folder”、“JNI Folder”,按提示进行。
    有一个“Change Folder Location”选项,不需要勾选,因为jni文件夹采用默认的位置(在main文件夹中)就行。然后main目录下会出现jni文件夹。


    新建一个MyExample的类(与MainActivity在同一目录下),加载jni库,声明native方法

    package com.ndkexample;
    
    public class MyExample {
        static {
            System.loadLibrary("ndkexample");
        }
        public native void myLog();//打印日志信息的函数
    }
    此时你的myLog方法还是红色的,在上面按alt+enter生成c层的方法。
    添加一个打印日志的方法_android_log_write(......);

    #include <jni.h>
    #include "android/log.h"
    JNIEXPORT void JNICALL
    Java_com_ndkexample_MyExample_myLog(JNIEnv *env, jobject instance) {
        // TODO
        __android_log_write(ANDROID_LOG_ERROR,"MainActivity","This is my first ndkexample!");
    
    }
    尤其不要忘记引入头文件log.h

    之后clean project会在jni目录生成对应的头文件


    然后在java层进行调用

    package com.ndkexample;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            MyExample myExample=new MyExample();
            myExample.myLog();
        }
    }

    编译运行可以看到日志信息被打印出来

    06-22 20:36:25.984 31550-31550/? I/art: Late-enabling -Xcheck:jni
    06-22 20:36:26.029 31550-31558/? I/art: Debugger is no longer active
    06-22 20:36:26.057 31550-31550/? I/HwCust: Constructor found for class android.app.HwCustHwWallpaperManagerImpl
    06-22 20:36:26.104 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl
    06-22 20:36:26.109 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl
    06-22 20:36:26.114 31550-31550/? E/MainActivity: This is my first ndkexample!
    06-22 20:36:26.175 31550-31630/? I/OpenGLRenderer: Initialized EGL, version 1.4

    至此成功。
    如果遇到问题无法解决可以咨询我的QQ:1925554595



    微信公众号 日记文学
  • 相关阅读:
    window.open打开新的独立页面
    域名如何添加解析?
    URL 链接中的 UTM参数何定义?
    学习总结【匿名函数,匿名自执行函数】
    CSS布局之Flex布局
    CSS布局之display: tables布局
    CSS里盒子模型中【margin垂直方向边界叠加】问题及解决方案
    Hibernate 事务管理
    Hibernate 二级缓存
    Hibernate c3p0的整合
  • 原文地址:https://www.cnblogs.com/xtubjut/p/5624735.html
Copyright © 2020-2023  润新知