作为一个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:cygwin64android-ndk-r8c dk-build
c/c++ General/Paths and Symbols/GNU C add D:cygwin64android-ndk-r8cplatformsandroid-14arch-armusrinclude
假设还在报一些编译环境的错误。把project转移到D:cygwin64android-ndk-r8csamples基本就能够通过,这里我也不是非常清楚是为什么,预计是路径映射的问题,哪位大神知道,能够分享下。