前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 学习JNI,用JAVA调用C

Android 学习JNI,用JAVA调用C

作者头像
DragonKingZhu
发布2022-05-08 16:41:08
6300
发布2022-05-08 16:41:08
举报

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档