NDK開發知識點
1、NDK介紹
- 對于大部分應用開發者來說,可能都不怎么的接觸到NDK,但是如果涉及到了硬件的操作,就不得不去使用NDK了,使用NDK還有一個原因,就是c/c++的效率高,因此我們把一些耗時的操作放到NDK中實現
- NDK 簡稱 Native Develpoment Kit,他是一個工具集,集成了Android的交叉編譯環境,并提供了一套比較方便的Makefile,可以幫助開發者快速開發C或者C++的動態庫,并自動的將so和java程序打包成apk,在Android上運行
2、配置NDK開發環境
- 下載解壓,配置path路徑
- 下載地址:http://developer.android.com/ndk/downloads/index.html
- 百度云盤地址:http://pan.baidu.com/s/1mh2leBY(64位的)
3、JNI概述
- JNI Java Native Interface的縮寫,中文為JAVA本地調用,它允許Java代碼和其他語言寫的代碼進行交互
4、JNI程序實現步驟
1、編寫帶有native聲明的方法的java類
private native int add(int num1, int num2);
2、使用javac命令編譯所編寫的java類
-
用AS自帶的Terminal進行處理
- 進入到這個項目中,到這個文件下
- ` javah -jni com.example.firstndk.MainActivity
- 這里需要注意,有可能編譯的時候出現編碼GBK的不可映射字符,這里用記事本打開這個MainActivity.java文件,保存選擇文件類型是ANSI的編碼,在此運行即可解決
`
3、然后使用javah + java類名生成擴展名為h的頭文件
-
4、使用c/c++實現本地方法
- 在jni目錄下創建這個方法,然后自己去寫
- `#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++編寫的文件生成動態鏈接庫
- 在jni目錄下創建Android.mk文件,寫入以下(后面的注釋要去掉)
LOCAL_PATH := $(call my-dir) //指定編譯的路徑 include $(CLEAR_VARS) //每個新模塊的開始處,清理所有的LOCAL_XXX LOCAL_MODULE :=hello //定義了模塊的名稱 LOCAL_SRC_FILES :=hello.c //源代碼文件 include $(BUILD_SHARED_LIBRARY) //說明編譯的是共享庫及動態鏈接庫
- 在jni目錄下創建Android.mk文件,寫入以下(后面的注釋要去掉)
-
6、測試
*首先用cmd命令行,切換到ndk目錄(比如要切換E盤,那么直接E:然后enter,切換到目錄后輸入ndk-build按下enter進行編譯就行)
-
在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 "模塊名"(就是你要調用的c代碼,我這里是hello,那么我就寫hello)}
- 3、在gradle.properties里最下面加入一句
android.useDeprecatedNdk=true
- 4 、在MainActivity.java里面加入一句靜態語句塊` /**
- 不要忘了在這里靜態的加載一下
*/
static {
System.loadLibrary("hello"); //比如so庫是libhello.so 去掉lib
}`
- 1、在local.properities文件中添加:ndk(ndk的路徑)
最后運行結果: