【Android高級】NDK/JNI編程技術基礎介紹
作為一個Andoird的Java程序猿,會受到Java語言的局限。由於作為一面門向對象的語言不能像C/C++那樣輕易調用與硬件有關的操作。因此JNI就搭建了這樣一個橋梁,使Java和C/C++語言之間能夠互相調用。
作為一個Javaproject師對C/C++的語言不是非常熟悉,但僅僅需熟悉他們之間調用的原理和方法,關於C/C++的編程就交給C語言project師去吧。
在這篇文章中主要介紹NDK/JIN搭建和基本用法。
一、 環境的搭建
二、 主要的使用
步驟:
(1)新建Androidproject
(2)在java中聲明native方法
(3)在project中新建jni目錄(使用javah test 生成頭文件,編寫C代碼)
(4)編寫Android.mk文件(是一個配置文件告訴NDK怎樣編譯C代碼)
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test-jni LOCAL_SRC_FILES := test-jni.c LOCAL_LDLIBS+=-llog include $(BUILD_SHARED_LIBRARY)
(5)運行"ndk-build"生成動態庫(在eclipse使用run也能夠生成動態庫)
(6)java代碼"load"動態庫,調用動態庫
1、java調用C
java 調用native method(Class param)
在c中會調用的方法中參數(JNIEnv*,Jobject,Jint...)
2、c調用java
先用java調用c。c然後回調
JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_callHi(JNIEnv *env, jobject obj) { char*classname = "com/ndk2/test/ProvideBean"; jclass clazz; clazz = (*env)->FindClass(env, classname); if (clazz == 0) { LOGI("can not find class"); } else { LOGI("find the class"); } jmethodID mid = (*env)->GetMethodID(env, clazz, "showHi", "()V"); if (mid == 0) { LOGI("can not find method"); } else { LOGI("find method"); } (*env)->CallVoidMethod(env, obj, mid); } JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_calladd(JNIEnv *env, jobject obj) { char*classname = "com/ndk2/test/ProvideBean"; jclass clazz; clazz = (*env)->FindClass(env, classname); if (clazz == 0) { LOGI("can not find class"); } else { LOGI("find the class"); } jmethodID mid = (*env)->GetMethodID(env, clazz, "showAdd", "(II)V"); if (mid == 0) { LOGI("can not find method"); } else { LOGI("find method"); } (*env)->CallVoidMethod(env, obj, mid, 6, 7); }
c/c++ Bulid Build command: bash D:\cygwin64\android-ndk-r8c\ndk-build
c/c++ General/Paths and Symbols/GNU C add D:\cygwin64\android-ndk-r8c\platforms\android-14\arch-arm\usr\include
假設還在報一些編譯環境的錯誤。把project轉移到D:\cygwin64\android-ndk-r8c\samples基本就能夠通過,這裏我也不是非常清楚是為什麽,預計是路徑映射的問題,哪位大神知道,能夠分享下。
【Android高級】NDK/JNI編程技術基礎介紹