Android 学习JNI,用JAVA调用C

2022-05-08 16:41:08 浏览数 (1)

首先必须知道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语言成功。

0 人点赞