@cyysu
2017-09-22T05:38:40.000000Z
字数 1646
阅读 700
- 时间: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 __cplusplus
extern "C" {
#endif
/*
* Class: TestJNI
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_TestJNI_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Makefile: 上层编译文件。
# global variables defination
JAVAC=javac
JAVAH=javah
GCC=gcc
JAVAINCLUDE=-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 target
ALL:TestJNI libTestjni.so RUN
TestJNI: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