全志A33开发板的安卓控制LED-2-JNI基础
虽然您可以完全使用Java编写应用程序,但有些情况下Java本身并不能满足您的应用程序的需求。当应用程序不能完全用Java编写时,程序员使用JNI编写Java本机方法来处理这些情况。
以下示例说明何时需要使用Java本机方法:
标准Java类库不支持应用程序所需的与平台相关的功能。
您已经有一个用另一种语言编写的库,并希望通过JNI使其可以访问Java代码。
您希望在较低级别的语言(如汇编语言)中实现一小部分时间关键代码。
来源:https://docs.oracle.com/javase/1.5.0/docs/guide/jni/
开发平台
芯灵思SinlinxA33开发板
了解JNI函数
JNI函数就是在native层定义的本地函数,对应于在java层使用native关键字声明的方法的。直白的说,就是在Java层声明,C/C++语言实现的。当然,这个函数并不一般,它会通过JNI某种机制与Java层的方法进行关联,使得Java层代码可以很方便的调用它。
jni函数的语法和调用规则
- 将java语言的数据类型转换成底层语言调用规则
- 将java语言的方法调用转换成底层语言函数或方法
jni数据类型的转化
jni在java和C之间建立连接,因此jni首先要统一两者的数据类型
Java Type | Native Type | Description |
---|---|---|
boolean | jboolean | unsigned 8 bits |
byte | jbyte | signed 8 bits |
char | jchar | unsigned 16 bits |
short | jshort | signed 16 bits |
int | jint | signed 32 bits |
long | jlong | signed 64 bits |
float | jfloat | 32 bits |
double | jdouble | 64 bits |
void | void | N/A |
The following definition is provided for convenience.
define JNI_FALSE 0 #define JNI_TRUE 1
The jsize integer type is used to describe cardinal indices and sizes:
typedef jint jsize;
- java中可以直接调用底层语言的函数,jni规定了java调用底层语言的方法签名
- java中有重载概念,所以java方法转换成签名,签名再转化为函数
Type Signature | Java Type |
---|---|
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L | fully-qualified-class |
[ type | type[] |
For example, the Java method:
long f (int n, String s, int[] arr);
has the following type signature:
(ILjava/lang/String;[I)J
jni机制实现
native 声明的函数可以不实现 class Cls { native double f(int i, String s); // 声明为本地方法 static { System.loadLibrary(“库名”); // 通过静态初始化语句块来加载动态库 } }
程序实现测试java代码javah -jni Hello
生成Hello .h
打开Hello .h 文件里面已经写好C函数的名字
C代码
将C文件制做成共享库.so,注意指定jni.h和jni_md.h文件路径
gcc -shared -fPIC hello.c -o libhello.so -I /usr/java/jdk1.6.0_45/include/ -I /usr/java/jdk1.6.0_45/include/linux/
java Hello
运行程序
实验现象
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
在unity中如何使用delegate
总结下使用C#中的委托(delegate)吧,其实这个并不难,但是对于没接触过的人还是有点小问题的,现在我在这做一个简单的例子来帮助大家对delegate的理解吧,想要更加加深对委托的理解,请度娘下吧,我就不在这丢人了,我也是百度后才对委托有了进一步的理解的!我们在unity中先建一个脚本,取名为TestDelegate。我做的这个测试主要是点击输出中文名字按钮来输出中文名字,点击英文名字来输出英文名字,这里有2个函数,一个是输出中文名字,还有一个就是输出英文名字的,如果我们不用委托的话,想要实现这个函数的话,那我们就要使用判断语句来实现吧(if else , switch)。现在用委托的话我们就不用写判断语句了,想我这样的人,大部分代码都是判断语句,现在我看见if else, switch,都心烦啊,大神的代码都很少出现这些呀,在其中也为我敲醒了一个警钟了,还得好好加倍努力啊, 好了 现在我们来写下简单的代码吧。如下using UnityEngine;using System.Collections;public class TestDelegate : MonoBehaviour{...
- 下一篇
阿里云镜像市场mysql默认密码如何修改 图文教程
问题说明 小编在阿里云上够买了云服务器,因为省事,不想依次安装Java运行环境(jdk+mysql+tomcat),之前依次在linux安装jdk,mysql,tomcat还是比较繁琐的,为了节省时间,以后都采用镜像市场里面的。 所以在镜像市场上找了免费的Java运行环境镜像:https://market.aliyun.com/products/53400005/cmjj014493.html?spm=5176.730005.productlist.d_cmjj014493.265b3524Heeo1k&innerSource=search_java 但是问题来了,安装mysql成功之后,是需要有一个默认密码的,没有默认密码,你也没有办法去修改新密码。 mysql的默认密码在哪里? 问题分析 因为镜像市场提供的是一套软件包,安装之后,肯定会在linux上某个文件上记录mysql的初始默认密码的。根据这个分析,我们去找下默认密码 问题解决 找到默认密码: 登录Linux远程服务器之后:我们发现了readme.txt文件。 vim /root/readme.txt 解释说明:利用v...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主