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目錄下:
用指令行,到helloJni檔案加下:
>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開發流程就走完了