@cyysu
2017-09-22T05:38:40.000000Z
字数 1646
阅读 808
- 时间:2017年9月4日
- 作者:MJ_DZ chen yuan
- 邮箱:chenyuan@ypmingjiang.cn
- 描述:JNI与底层接口篇
- 版本:V2.0
嵌入式Linux
JNI(Java Native Interface)意为Java本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。
TestJNI.java: 函数功能主要是暴露底层的接口,方便上层进行调用。
public class TestJNI{public native void print();static {System.loadLibrary("Testjni");}}
TestJNI.c: 函数功能主要是实现Java定义的接口,采用C代码实现,同样的也可以采用其他语言,如C++。
#include "TestJNI.h"#include <stdio.h>#include <jni.h>JNIEXPORT void JNICALL Java_TestJNI_print(JNIEnv *env,jobject obj){printf("Hello world!!!");return;}
TestJNI.h: 函数功能主要是声明实现接口函数的定义。为自动生成。
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class TestJNI */#ifndef _Included_TestJNI#define _Included_TestJNI#ifdef __cplusplusextern "C" {#endif/** Class: TestJNI* Method: print* Signature: ()V*/JNIEXPORT void JNICALL Java_TestJNI_print(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
Makefile: 上层编译文件。
# global variables definationJAVAC=javacJAVAH=javahGCC=gccJAVAINCLUDE=-I /opt/j2sdk1.4.2_11/include/JAVAINCLUDELINUX=-I /opt/j2sdk1.4.2_11/include/linux/CURRENTDIR=-I $(shell pwd)CFLAGS=-fPIC -shared -o# Appoint to overall targetALL:TestJNI libTestjni.so RUNTestJNI:TestJNI.java$(JAVAC) $<$(JAVAH) $@libTestjni.so:TestJNI.c$(GCC) $(JAVAINCLUDE) $(JAVAINCLUDELINUX) $(CURRENTDIR) $(CFLAGS) $@ $<RUN:HelloWorld.java$(JAVAC) $<
执行完make命令之后就会生成底层的so文件和上层Java的class文件,这两个文件在工程中是必须存在的,其他文件在编译完成之后就可以删除。下面就开始编写测试文件。
HelloWorld.java: 测试接口函数
public class HelloWorld{public static void main(String[] args){new HelloWorld();}public HelloWorld(){new TestJNI().print();}}
在运行之前一定要将这个so文件所在路径告诉系统,否则在运行会出现错误。
export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH
mj@DZ:~/桌面/jni$ tree -L 1.├── backup├── HelloWorld.class├── libTestjni.so├── Makefile└── TestJNI.class