【Android高级NDK/JNI编程技术基础介绍】别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述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 studio友盟分享
- What really happens when you navigate to a URL
- 嵌入APP的身份证识别SDK,识别速度小于1S
- Android Activity和Fragment的生命周期图
- Android中EditText显示明文与密文的两种方式
- android和.net webservice中的DES加密算法
- AndroidStudio的一些坑
- Spring系列之beanFactory与ApplicationContext
- [Android问答] 开发环境问题集锦