全志A33开发板的安卓控制LED-2-JNI基础

简介: 虽然您可以完全使用Java编写应用程序,但有些情况下Java本身并不能满足您的应用程序的需求。当应用程序不能完全用Java编写时,程序员使用JNI编写Java本机方法来处理这些情况。以下示例说明何时需要使用Java本机方法: 标准Java类库不支持应用程序所需的与平台相关的功能。

虽然您可以完全使用Java编写应用程序,但有些情况下Java本身并不能满足您的应用程序的需求。当应用程序不能完全用Java编写时,程序员使用JNI编写Java本机方法来处理这些情况。
以下示例说明何时需要使用Java本机方法:

标准Java类库不支持应用程序所需的与平台相关的功能。
您已经有一个用另一种语言编写的库,并希望通过JNI使其可以访问Java代码。
您希望在较低级别的语言(如汇编语言)中实现一小部分时间关键代码。
来源:https://docs.oracle.com/javase/1.5.0/docs/guide/jni/

开发平台

 芯灵思SinlinxA33开发板

image

了解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 运行程序
实验现象

相关文章
|
7月前
|
Android开发
手把手教你深度定制tiny4412安卓5.0系统(一)---开发板如何预置文件到android系统
手把手教你深度定制tiny4412安卓5.0系统(一)---开发板如何预置文件到android系统
120 0
|
10月前
|
Linux Shell Android开发
【Linux系统开发】Study210开发板刷安卓系统
【Linux系统开发】Study210开发板刷安卓系统
141 0
|
Android开发
Headless Android开发板的调试及远程显示和控制
最近在调试msm8996的开发板,由于主板和LCD子板还没回来,所以先回的核心板算是个Headless的Android Device。核心板有独立供电,另外还有USB Type-C、FAN、HDMI、TF Card和KEY等硬件模块,目前都已调通,效果如下图所示。
1702 0
|
Android开发
手把手教你深度定制tiny4412安卓5.0系统(一)---开发板如何预置文件到android系统
想要预置文件,首先要了解Android源码中device这个目,打开这个目录我们看到,这个目录厂家会针对不同的开发板做一些修改: 在这个目录中,我们看到有不同的厂家定制的信息,我们这款开发板是友善之壁提供的,那么我们只要进入friend-arm这个目录下就可以了,进到这个目录,看到tiny4412,我们切换进入看到: 要预置相关的文件,前面有一篇文章专门讲过怎么预置,一般是在device.mk中进行,但是平台不同,供应商会整合到其它地方: 文章如下,下面我们将参考这篇文章进行预置。
1596 0
|
Android开发
安卓selinux权限修改(基于tiny4412开发板)
在源代码根目录下: system/core/init/init.c   找到 static void selinux_initialize(void) 函数将boot is_enforcing = selinux_is_enforcing();改成boot is disabled = selinux_is_disabled();security_setenforce(is_disabled); 重新编译即可。
1038 0
|
Android开发
安卓修改上层UI界面默认显示为竖屏显示(基于tiny4412开发板)
在Android 5.0源代码根目录下: 找到 :famerawork/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.
1202 0
|
Linux Android开发 Windows
友善之臂tiny4412-1306开发板安卓系统烧写
折腾了很久,终于烧写成功。不废话,咱们说说流程吧。 首先,我们需要有一个基于tiny4412的kernel,从友善之臂官网获取。 然后解压: 1、tar -xvf  linux-3.5 .... 然后cp  tiny4412-android_deconfig  .config 接下来make zImage 在 arch/arm/boot/生成对应的zImage ,这个也就是我们的kernrl。
2368 0
|
Ubuntu 测试技术 Linux
使用Android、S3C6410开发板和Ubuntu测试Linux驱动
开发可统计单词个数的Android驱动程序(2) 八、 指定回调函数       本节讲的内容十分关键。不管Linux驱动程序的功能多么复杂还是多么“酷”,都必须允许用户空间的应用程序与内核空间的驱动程序进行交互才有意义。
982 0
|
20天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0