標籤:
*************************************************華麗的分割線**************************************************************
NDK 開發步驟
1.建立一個項目
2.建立JNI目錄
3.編寫nativejava層方法
4.產生JNI標頭檔
(1)編寫javaNative代碼
(2)介紹一個命令javah
(3)添加android.jar包到環境變數
聲明一個native方法
建立JNI目錄
控制台進入當前項目目錄
輸入命令
E:\android workspace\HelloNDK_1>javah -classpath bin/classes;D:\android\android_
sdk_windows\platforms\android-19\android.jar -d jni com.example.hellondk_1.MainA
ctivity
產生JNI標頭檔(其中,D:\android\android_sdk_windows\platforms\android-19\android.jar,
是android sdk目錄下的目錄檔案,為了簡單,可以把android.jar檔案目錄添加到path路徑下;
最後com.example.hellondk_1.MainActivity是包名加類名)
重新整理項目可以看到jni目錄下多了一個.h檔案
建立一個.c檔案匯入相應的標頭檔
(
如:建立一個hello.c檔案
#include<stdio.h>
#include<stdlib.h>
#include"com_example_hellondk_1_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_hellondk_11_MainActivity_getStringFromC
(JNIEnv *env, jclass jclass){
return (*env)->NewStringUTF(env, "Hello from C !....");
}
其中實現了標頭檔中的方法Java_com_example_hellondk_11_MainActivity_getStringFromC(JNIEnv *, jclass);
)
在jni目錄下添加mk檔案。(這個可以匯入ndk的執行個體下面的mk檔案然後做修改就可以了)如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
其中,
LOCAL_MODULE 表示編譯產生的so叫什麼名字
LOCAL_SRC_FILES 表示要編譯的.c檔案是哪個
最後在項目路徑下執行ndk-build命令。
執行完之後對項目進行重新整理可以看到項目下面多了一個obj目錄裡面多了一個.so檔案。
然後在java檔案中添加靜態代碼塊。添加.so檔案。
最後運行代碼就可以看到結果了。
*************************************************華麗的分割線**************************************************************
JNIEnv* env表示當前線程的環境
jobject thiz表示當前的執行個體
jint si 表示一個int類型的變數
jfieldID fid表示一個欄位或者java某一個屬性。
jclass cls表示一個類或執行個體
jmethodID mid表示某個類裡面的某個方法的id
cls=(*env)->GetObjectClass(env,thiz);
mid=(*env)->GetStaticMethodID(env,cls,"callback","()V")//第三個參數表示一個靜態方法名
fid=(*env)->GetStaticFieldID(env,cls,"si","I");//後面兩個表示變數名和資料類型
si=(*env)->GetStaticIntFieldId(env,cls,fid);//取得fid這個欄位裡面的si資料賦值給si
LOCAL_LDLIBS+=-llog//在mk檔案中添加日誌庫
#include<android/long.h>//在c檔案中添加這個標頭檔加入android開發的log
_android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","xxx");//列印資訊
_android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","var=",var);//列印變數資訊
java---->jni----->c/c++資料轉換順序
JNI數組處理
很多方法可以在D:\android\android-ndk-r9c\platforms\android-16\arch-arm\usr\include\h=jni.h標頭檔裡面查看還有官方文檔
*************************************************華麗的分割線**************************************************************
Eclipse配置ndk開發(參考視頻教程:http://www.imooc.com/video/8028)
一、在Eclipse中選擇ndk目錄(Window--->Preferences--->Android---->NDK---->在NDK Location中選擇ndk的目錄位置)
二、配置產生javah選項
選擇External Tools(運行按鈕旁邊的那個裡面)----->選擇Program右鍵new----->輸入Name(如generate_c++_header_file)
----->在Main標籤頁下選擇Variables(選擇System_path然後加冒號:添加javah)------>然後選擇Working Directory
添加Variables(選擇project_loc然後添加\jni例如"${project_loc}\jni")------>然後添加Arguments參數
(-classpath ${project_loc}\bin\classes;D:\android\android_sdk_windows\platforms\android-19\android.jar -d
${project_loc}\jni -jni ${java_type_name})其中$xxx可以在Eclipse裡面選擇。----->最後run出現eclipse出現的
錯誤不要管。
使用即在項目下面建立一個jni目錄。然後在java檔案裡面添加native方法,然後選中這個java檔案,然後選擇運行按鈕
旁邊的綠色按鈕選擇我們配置好的generate_c++_header_file點擊運行,然後重新整理一下就可以看到jni目錄下面產生了.h檔案
(注意:工作目錄最好不要帶空格否則會出現一些錯誤)。
三、配置eclipse添加native支援jni方法代碼提示
在工作目錄右鍵選擇android Tools--->add native support
選擇項目右鍵選擇properties---->C++General--->Path and Symbols--->Includes下add---->File System
(選擇ndk所在目錄下的include:例如"D:\android\android-ndk-r9c\platforms\android-19\arch-arm\usr\include")
然後單擊應用,然後項目下面就多了一個Includes檔案夾
然後就可以在編寫jni代碼的時候按住ctrl+alt或alt+/得到代碼提示
四、配置產生javap選項
類似配置javah,
Location為${system_path:javap}
Working Directory為${project_loc}
Arguments為-classpath ${project_loc}\bin\classes -s -p ${java_type_name}
還可以配置ndk-build命令
*************************************************華麗的分割線**************************************************************
JNI資料類型講解
(
參考官網:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp428
或者部落格:http://blog.csdn.net/conowen/article/details/7523145
)
*************************************************華麗的分割線**************************************************************
android NDK 筆記