android NDK 筆記

*************************************************華麗的分割線**************************************************************
NDK 開發步驟
1.建立一個項目
2.建立JNI目錄
3.編寫nativejava層方法
4.生成JNI頭文件
(1)編寫javaNative代碼
(2)介紹一個命令javah
(3)添加android.jar包到環境變量html


聲明一個native方法java

建立JNI目錄android

控制檯進入當前項目目錄c++

輸入命令
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是包名加類名)windows

刷新項目能夠看到jni目錄下多了一個.h文件數組

建立一個.c文件導入相應的頭文件
(
如:建立一個hello.c文件
#include<stdio.h>
#include<stdlib.h>
#include"com_example_hellondk_1_MainActivity.h"oracle

JNIEXPORT jstring JNICALL Java_com_example_hellondk_11_MainActivity_getStringFromC
(JNIEnv *env, jclass jclass){eclipse

return (*env)->NewStringUTF(env, "Hello from C !....");
}
其中實現了頭文件中的方法Java_com_example_hellondk_11_MainActivity_getStringFromC(JNIEnv *, jclass);
)ide

在jni目錄下添加mk文件。(這個能夠導入ndk的實例下面的mk文件而後作修改就能夠了)以下
LOCAL_PATH := $(call my-dir)ui

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)
1、在Eclipse中選擇ndk目錄(Window--->Preferences--->Android---->NDK---->在NDK Location中選擇ndk的目錄位置)

2、配置生成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文件
(注意:工做目錄最好不要帶空格不然會出現一些錯誤)。


3、配置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+/獲得代碼提示

4、配置生成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)*************************************************華麗的分割線**************************************************************

相關文章
相關標籤/搜索