抛开死丢丢,在Terminal下写一次JNI --HelloWorld

ubuntu 18.04

实验前检查环境配置,确保 java编译运行版本一致

sudo update-alternatives –config java
sudo update-alternatives –config javac

JNI -HelloWorld 实验过程步骤

  1. 编写一个类(HelloWorld.java),并申请native方法
  2. 使用javac 编译HelloWorld源文件。结果会得到一个HelloWorld.class 的文件
  3. 使用 javah -jni 来生成C的头文件并包含声明了native方法
  4. 编写c的源文件去实习native方法
  5. 将c文件编译生成dll或者so库
  6. 运行java程序,验证jni的调用

编写Java文件

 //HelloWorld.java
   class HelloWorld{
       //申明的native方法
       private native void print();    
       public static void main(String[] args){
           new HelloWorld().print();
       }
       static {
       //加载库文件         System.load("/home/jason/code/JNI/helloworld/HelloWorld.so");
       }
  }
~                 

编译java源文件
javac HelloWorld.java 之后将获得HelloWorld.class

生成C系头文件
javah -jni HelloWorld 可以获得HelloWorld.h 文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

编写HelloWorld cpp源文件

#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_print
   (JNIEnv *env, jobject obj){
       printf("HelloWorld! From JNI\n");
       return ;
   }

* 生成so文件*

cpp文件里的jni.h 提示找不到
需要指定文件路径 -I

gcc -I /usr/lib/jvm/default-java/include/ -I /usr/lib/jvm/default-java/include/linux/ HelloWorld.cpp -shared -o HelloWorld.so
-I : 编译路径添加
-shared :表示生成共享库
-o :生成可运行 二进制文件

修改java代码,加载库文件代码,指定到文件中
区分System.load(“XXXX”)和System.loadLibrary(“XXX”)方法

java HelloWorld 运行校验

猜你喜欢

转载自blog.csdn.net/xiaocajiyyd/article/details/80684433
今日推荐