NDK简述
Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。
NDK包括了:
-
从C / C++生成原生代码库所需要的工具和build files。
-
将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
-
支持所有未来Android平台的一系列原生系统头文件和库
为何要用到NDK?
概括来说主要分为以下几种情况:
1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库被反编译的难度较大。
2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。
NDk之androidstudio 环境配置:
1在gradle.properties里面声明使用NDK的代码
android.useDeprecatedNdk=true
2在工程的local.properties里面添加NDK的路径代码:
ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\ndk-bundle
sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk
3.在app的build.gradle里面,添加NDK的编译信息
ndk {
moduleName "myJni"
abiFilters "armeabi", "arm", "x86"
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
三:编译代码:
1.编译Native方法,生成.h文件:
package com.zzh.hellojni;
/**
* Created by Administrator on 2017/8/23/023.
*/
public class MyJni {
public native String getString();
}
2点击Build-->Make Project,生成class文件
3找到class文件,在app->build->intermediates->classes->debug目录下:
>cd hellojni\build\intermediates\classes\debug
C:\Users\Administrator\FirstApp\android\hellojni\build\intermediates\classes\debug>javah -jni com.zzh.hellojni.MyJni
会生成一个com_zzh_hellojni_MyJni.h文件
内容为:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zzh_hellojni_MyJni */
#ifndef _Included_com_zzh_hellojni_MyJni
#define _Included_com_zzh_hellojni_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_zzh_hellojni_MyJni
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zzh_hellojni_MyJni_getString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
根据生成.h头文件,以及新建的.c或者.cpp文件,生成.so库文件
①在app->src->main目录下新建一个jni文件夹,用来存c/c++的头文件以及源文件,将刚刚生成.h头文件剪切到这里来,然后新建一个.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 JNICALL Java_com_zzh_hellojni_MyJni_getString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"Hi Jni!");
}
这样准备工作就完成了然后 点击Build->Make Project进行编译,生成.so库文件,路径:app->build->intermediates->ndk->debug->lib下:
如果执行失败。你可以把刚刚生成的Mk文件copy到jni文件夹下,然后使用命令行执行:
然后命令行到次文件加下:
如下
C:\Users\Administrator\FirstApp\android\hellojni\src\main\jni> ndk-build
然后把生成的SO文件copy到libs下面就可以了
这样一个完整NDk开发流程就走完了