NDK開發(fā)知識點(diǎn)
1乃坤、NDK介紹
- 對于大部分應(yīng)用開發(fā)者來說,可能都不怎么的接觸到NDK火惊,但是如果涉及到了硬件的操作,就不得不去使用NDK了奔垦,使用NDK還有一個(gè)原因屹耐,就是c/c++的效率高,因此我們把一些耗時(shí)的操作放到NDK中實(shí)現(xiàn)
- NDK 簡稱 Native Develpoment Kit椿猎,他是一個(gè)工具集惶岭,集成了Android的交叉編譯環(huán)境,并提供了一套比較方便的Makefile犯眠,可以幫助開發(fā)者快速開發(fā)C或者C++的動態(tài)庫按灶,并自動的將so和java程序打包成apk,在Android上運(yùn)行
2筐咧、配置NDK開發(fā)環(huán)境
- 下載解壓鸯旁,配置path路徑
- 下載地址:http://developer.android.com/ndk/downloads/index.html
- 百度云盤地址:http://pan.baidu.com/s/1mh2leBY(64位的)
3、JNI概述
- JNI Java Native Interface的縮寫量蕊,中文為JAVA本地調(diào)用铺罢,它允許Java代碼和其他語言寫的代碼進(jìn)行交互
4、JNI程序?qū)崿F(xiàn)步驟
1残炮、編寫帶有native聲明的方法的java類
private native int add(int num1, int num2);
2韭赘、使用javac命令編譯所編寫的java類
-
用AS自帶的Terminal進(jìn)行處理
- 進(jìn)入到這個(gè)項(xiàng)目中,到這個(gè)文件下
- ` javah -jni com.example.firstndk.MainActivity
- 這里需要注意势就,有可能編譯的時(shí)候出現(xiàn)編碼GBK的不可映射字符泉瞻,這里用記事本打開這個(gè)MainActivity.java文件,保存選擇文件類型是ANSI的編碼苞冯,在此運(yùn)行即可解決
`
3瓦灶、然后使用javah + java類名生成擴(kuò)展名為h的頭文件
-
4、使用c/c++實(shí)現(xiàn)本地方法
- 在jni目錄下創(chuàng)建這個(gè)方法抱完,然后自己去寫
- `#include "com_example_firstndk_MainActivity.h"
JNIEXPORT jint JNICALL Java_com_example_firstndk_MainActivity_add
(JNIEnv * env, jobject obj, jint num1, jint num2){
return num1 + num2;
}
` -
5贼陶、將c/c++編寫的文件生成動態(tài)鏈接庫
- 在jni目錄下創(chuàng)建Android.mk文件,寫入以下(后面的注釋要去掉)
LOCAL_PATH := $(call my-dir) //指定編譯的路徑 include $(CLEAR_VARS) //每個(gè)新模塊的開始處巧娱,清理所有的LOCAL_XXX LOCAL_MODULE :=hello //定義了模塊的名稱 LOCAL_SRC_FILES :=hello.c //源代碼文件 include $(BUILD_SHARED_LIBRARY) //說明編譯的是共享庫及動態(tài)鏈接庫
- 在jni目錄下創(chuàng)建Android.mk文件,寫入以下(后面的注釋要去掉)
-
6碉怔、測試
*首先用cmd命令行,切換到ndk目錄(比如要切換E盤禁添,那么直接E:然后enter撮胧,切換到目錄后輸入ndk-build按下enter進(jìn)行編譯就行)
-
在Android Studio中要注意的:
- 1、在local.properities文件中添加:ndk(ndk的路徑)
ndk.dir=F\:\\xunlei\\android-ndk-r10e
(如果在AS的Project Structure 中的SDK Location里面指定了NDK的目錄)這一步可以省略 - 2老翘、在build.gradle文件有defaultConfig配置中添加:ndk{moduleName "模塊名"(就是你要調(diào)用的c代碼芹啥,我這里是hello锻离,那么我就寫hello)}
- 3、在gradle.properties里最下面加入一句
android.useDeprecatedNdk=true
- 4 墓怀、在MainActivity.java里面加入一句靜態(tài)語句塊` /**
- 不要忘了在這里靜態(tài)的加載一下
*/
static {
System.loadLibrary("hello"); //比如so庫是libhello.so 去掉lib
}`
- 1、在local.properities文件中添加:ndk(ndk的路徑)
最后運(yùn)行結(jié)果: