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下载,也可以通过这个链接下载:下载地址,至于版本的话,根据自己电脑系统自行选择最新版本,

如果访问不了,需要使用FQ的话,可以下载天行VPN(有试用版,一天一个小时,关键是不要钱还能FQ),FQ工具下载链接: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();

}

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

③找到class文件,在app->build->intermediates->classes->debug目录下:
这里写图片描述
④通过javah命令生成.h头文件,点击Android Studio底下菜单中的Terminal

依次敲入:

cd app\build\intermediates\classes\debug
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文件
新建 .c文件
这里写图片描述

选择对话框中的 .c/.h
这里写图片描述

完成后,可以把同一个文件名.h的文件删除,效果如下图:
这里写图片描述

    将edan_com_as_ndk_demo_ndktest_NdkJniUtils.h中的方法复制到jnitest.c文件下,在改成如下效果即可。
#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,基本都能解决,当然,也可以留言,知道的必将言无不尽。

第六步:给大家安个小亮点,用命令来进行打现有的.c或者.cpp文件:
    
1、在main下面建一个jni文件
2、将.c /.cpp 、.h 文件一同放入jni目录下
3、建mk配置文件: Android.mkApplication.mk
Application.mk示例:
4、利用AS中的Terminal或者CMD命令行模式的窗口中打开至jni的目录下,然后输入:ndk-build—回车即可,就会自动打包so库了,so库的文件放在main目录下的libs或者obj目录下,将其copy至app目录下的libs即可
在这里插入图片描述

5、注:打包后so库后,要运行编译时将jni目录改个名字,现在有些gradle版本不支持.mk了,如果在运行时不屏蔽的话会报错,如果将jni改成cpp或者别的目录就不会去自动编译了

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog
#需要修改输出.so文件的名字字段——打包后为libtest_api.so。
LOCAL_MODULE := test_api
#以下是将多个.c或者.cpp文件集合打包
LOCAL_SRC_FILES :=d3des.c \
grcbmng.c \
hsmpos.c
include $(BUILD_SHARED_LIBRARY)

Application.mk示例:

#表示要打些什么so库版本
APP_ABI := armeabi armeabi-v7a x86 mips arm64-v8a

源码下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值