zoukankan      html  css  js  c++  java
  • Android Studio 之 NDK篇

      由于工作内容的关系,对于NDK的工作涉及比较广(保密性,安全性),所以本章内容讲述一下NDK的基本使用过程。

      网上也有很多这样的教程或者描述,但描述的并不完全

      开发工具:Android Studio 2.1.2 

      NDK版本:android-ndk-r10e,支持64位so库的编译

      JDK版本:1.8 64位

      使用步骤如下:

      第一步:NDK环境的搭建

      ①jdk,Android SDK这些准备充分(只要能正常使用Android Studio的,这一条基本不用考虑)

      ②下载NDK,可以通过Android Studio的SDK Manager下载,也可以通过这个链接下载:下载地址,至于版本的话,根据自己电脑系统自行选择最新版本,

       如果访问不了,需要使用翻墙的话,可以下载天行VPN(有试用版,一天一个小时,关键是不要钱还能翻墙),翻墙工具下载链接:VPN工具下载

      第二步:新建一个Project,完成NDK的配置

      ①在工程的local.properties里面添加NDK的路径代码:

    ndk.dir=C:\android-ndk-r10e

      

      ②在gradle.properties里面声明使用NDK的代码

    android.useDeprecatedNdk=true

      

      ③在app的build.gradle里面,添加NDK的编译信息(包括生成的so库名字,以及编译出来的各种平台版本)

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "24.0.0"
    
        defaultConfig {
            applicationId "edan.com.as_ndk_demo"
            minSdkVersion 11
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
            ndk{
                moduleName "MyTestJniLib" //生成的.so的名字
                abiFilters "armeabi","armeabi-v7a","x86"
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.4.0'
    }

      第三步:编辑native方法,生成.h头文件

      ①编辑native方法

    package edan.com.as_ndk_demo.ndktest;
    
    /**
     * Created by ouyangshengduo on 2016/9/23.
     */
    public class NdkJniUtils {
    
        static {
            System.loadLibrary("MyTestJniLib");   //defaultConfig.ndk.moduleName
        }
        public native String getCLanguageString();
    
    }
    View Code

      ②点击Build-->Make Project,生成class文件

      ③找到class文件,在app->build->intermediates->classes->debug目录下:

      ④通过javah命令生成.h头文件,点击Android Studio底下菜单中的Terminal

      依次敲入:

    cd appuildintermediatesclassesdebug
    javah -jni edan.com.as_ndk_demo.ndktest.NdkJniUtils

    使用javah的时候,具体的包名按照实际情况来书写

      没有什么错误的话,可以在debug目录下看到.h的头文件

      

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class edan_com_as_ndk_demo_ndktest_NdkJniUtils */
    
    #ifndef _Included_edan_com_as_ndk_demo_ndktest_NdkJniUtils
    #define _Included_edan_com_as_ndk_demo_ndktest_NdkJniUtils
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     edan_com_as_ndk_demo_ndktest_NdkJniUtils
     * Method:    getCLanguageString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_edan_com_as_1ndk_1demo_ndktest_NdkJniUtils_getCLanguageString
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

      第四步:根据生成.h头文件,以及新建的.c或者.cpp文件,生成.so库文件

      ①在app->src->main目录下新建一个jni文件夹,用来存c/c++的头文件以及源文件,将刚刚生成.h头文件剪切到这里来,然后新建一个.c或者.cpp文件

      

    #include "edan_com_as_ndk_demo_ndktest_NdkJniUtils.h"
    /*
     * Class:     com_example_edu_ndktest_NdkJniUtils
     * Method:    getCLanguageString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_edan_com_as_1ndk_1demo_ndktest_NdkJniUtils_getCLanguageString
      (JNIEnv *env, jobject obj){
         return (*env)->NewStringUTF(env,"My name is Ouyangshengduo,Hi!");
      }

      ②点击Build->Make Project进行编译,生成.so库文件,路径:app->build->intermediates->ndk->debug->lib下:

      

      ③拷贝lib下的这些文件夹,到app->libs下:

      第五步:通过MainActivity的TextView显示C里面的内容:

      

    package edan.com.as_ndk_demo;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.TextView;
    
    import edan.com.as_ndk_demo.ndktest.NdkJniUtils;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTextView = (TextView) findViewById(R.id.text);
            NdkJniUtils ndk_util = new NdkJniUtils();
            mTextView.setText(ndk_util.getCLanguageString());
    
        }
    }

      至此,Android Studio 的NDK的基础篇讲述完了,期间遇到任何问题或者错误,将错误信息copy去google,基本都能解决,当然,也可以留言,知道的必将言无不尽。

      项目源码下载地址:源码下载

      

  • 相关阅读:
    The Mac Application Environment 不及格的程序员
    Xcode Plugin: Change Code In Running App Without Restart 不及格的程序员
    The property delegate of CALayer cause Crash. 不及格的程序员
    nil localizedTitle in SKProduct 不及格的程序员
    InApp Purchase 不及格的程序员
    Safari Web Content Guide 不及格的程序员
    在Mac OS X Lion 安装 XCode 3.2 不及格的程序员
    illustrate ARC with graphs 不及格的程序员
    Viewing iPhoneOptimized PNGs 不及格的程序员
    What is the dSYM? 不及格的程序员
  • 原文地址:https://www.cnblogs.com/ouyangduoduo/p/5900040.html
Copyright © 2011-2022 走看看