[关闭]
@cyysu 2017-09-22T05:38:40.000000Z 字数 1646 阅读 700

JNI与底层接口篇

  • 时间:2017年9月4日
  • 作者:MJ_DZ chen yuan
  • 邮箱:chenyuan@ypmingjiang.cn
  • 描述:JNI与底层接口篇
  • 版本:V2.0

嵌入式Linux


开篇的话

  1. JNI(Java Native Interface)意为Java本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。

程序源码

TestJNI.java: 函数功能主要是暴露底层的接口,方便上层进行调用。

  1. public class TestJNI{
  2. public native void print();
  3. static {
  4. System.loadLibrary("Testjni");
  5. }
  6. }

TestJNI.c: 函数功能主要是实现Java定义的接口,采用C代码实现,同样的也可以采用其他语言,如C++。

  1. #include "TestJNI.h"
  2. #include <stdio.h>
  3. #include <jni.h>
  4. JNIEXPORT void JNICALL Java_TestJNI_print(JNIEnv *env,jobject obj)
  5. {
  6. printf("Hello world!!!");
  7. return;
  8. }

TestJNI.h: 函数功能主要是声明实现接口函数的定义。为自动生成。

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class TestJNI */
  4. #ifndef _Included_TestJNI
  5. #define _Included_TestJNI
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class: TestJNI
  11. * Method: print
  12. * Signature: ()V
  13. */
  14. JNIEXPORT void JNICALL Java_TestJNI_print
  15. (JNIEnv *, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

Makefile: 上层编译文件。

  1. # global variables defination
  2. JAVAC=javac
  3. JAVAH=javah
  4. GCC=gcc
  5. JAVAINCLUDE=-I /opt/j2sdk1.4.2_11/include/
  6. JAVAINCLUDELINUX=-I /opt/j2sdk1.4.2_11/include/linux/
  7. CURRENTDIR=-I $(shell pwd)
  8. CFLAGS=-fPIC -shared -o
  9. # Appoint to overall target
  10. ALL:TestJNI libTestjni.so RUN
  11. TestJNI:TestJNI.java
  12. $(JAVAC) $<
  13. $(JAVAH) $@
  14. libTestjni.so:TestJNI.c
  15. $(GCC) $(JAVAINCLUDE) $(JAVAINCLUDELINUX) $(CURRENTDIR) $(CFLAGS) $@ $<
  16. RUN:HelloWorld.java
  17. $(JAVAC) $<

执行完make命令之后就会生成底层的so文件和上层Java的class文件,这两个文件在工程中是必须存在的,其他文件在编译完成之后就可以删除。下面就开始编写测试文件。
HelloWorld.java: 测试接口函数

  1. public class HelloWorld{
  2. public static void main(String[] args){
  3. new HelloWorld();
  4. }
  5. public HelloWorld(){
  6. new TestJNI().print();
  7. }
  8. }

在运行之前一定要将这个so文件所在路径告诉系统,否则在运行会出现错误。
export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

  1. mj@DZ:~/桌面/jni$ tree -L 1
  2. .
  3. ├── backup
  4. ├── HelloWorld.class
  5. ├── libTestjni.so
  6. ├── Makefile
  7. └── TestJNI.class

测试文件链接

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注