1. 程式人生 > >【Android高級】NDK/JNI編程技術基礎介紹

【Android高級】NDK/JNI編程技術基礎介紹

data jint man 搭建 原理 編程 java代碼 rom pat

作為一個AndoirdJava程序猿,會受到Java語言的局限。由於作為一面門向對象的語言不能像C/C++那樣輕易調用與硬件有關的操作。因此JNI就搭建了這樣一個橋梁,使JavaC/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編程技術基礎介紹