首先必须知道JNI是什么东东?
JNI(Java Native Interface)是java本地语言接口,也就是提供一种方法可以用JAVA调用底层语言(C/C )。一般如果项目必须使用C语言操作底层的硬件,那就必须用到JNI技术。
那既然要使用JAVA调用C语言,那必须要解决几个问题?
1:JAVA是面向对象的语言,而C是面向过程的语言
2:JAVA中的Object,String类型,Boolean类型,在C中都是没有的,那C语言是如何识别的?
其实这些JNI都给我们做好了,在JNI的头文件#include <jni.h>中就有
代码语言:javascript复制typedef unsigned char jboolean; /* unsigned 8 bits */
typedef signed char jbyte; /* signed 8 bits */
typedef unsigned short jchar; /* unsigned 16 bits */
typedef short jshort; /* signed 16 bits */
typedef int jint; /* signed 32 bits */
typedef long long jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */
代码语言:javascript复制/*
* Reference types, in C.
*/
typedef void* jobject;
typedef jobject jclass;
typedef jobject jstring;
typedef jobject jarray;
typedef jarray jobjectArray;
typedef jarray jbooleanArray;
typedef jarray jbyteArray;
typedef jarray jcharArray;
typedef jarray jshortArray;
typedef jarray jintArray;
typedef jarray jlongArray;
typedef jarray jfloatArray;
typedef jarray jdoubleArray;
typedef jobject jthrowable;
typedef jobject jweak;
可以看到JAVA中的object对象在void* ,这个学过C语言的大家都知道。
注意:在学习JNI之前,需要在Google官网下载NDK安装,并且配置环境变量。
本次我们学习如何使用JAVA语言调用C语言,然后打印Hello World!
第一步: 建立一个Android Application工程
第二步:在项目根目录下建议一个文件夹,命名为jni
第三步:在jni文件夹中,创建一个C文件
第四步:在Java代码,创建一个本地方法: helloFromC
第五步:在hello.c中实现第四步定义的本地函数,但是函数名必须为:Java 包名 Java文件 本地方法名
如: Java_com_demo_helloworld_MainActivity_helloFromC(JNIEnv* env, jobject obj)
第六步:把c的字符串转化为Java的字符串返回
第七步:在jni文件夹中创建Android.mk文件,这个类似与MakeFile文件
第八步:在jni文件夹下执行ndk-build.cmd指令
第九步:在Java中加载动态库,调用本地方法
第十步:部署,如果出现以下错误
说明CPU平台是补对的,默认是ARM的架构CPU,而我模拟器用的X86的,难道我要新建一个ARM的模拟器,不用那么麻烦
第十一步:编译支持X86的平台,在jni文件夹下新建Application.mk文件
可以发现再次编译,出现了x86的库
再次部署运行:
可以看到C语言返回的Hello_World可以正常打印出来了。说明JAVA调用C语言成功。