JNI,作为java和C/C++的中间层,为在Java中调用C/C++代码提供了便利。作为初学者,这里简单记录学习的过程。
本文所有的操作都在kali linux上进行,jdk环境以及gcc,g++编译器需自行提前安装好
操作系统:
jdk:
gcc/g++:
创建Java文件:HelloJNI.java
public class HelloJNI {
static {
//添加共享库
System.loadLibrary("hello");
}
//native代表底层调用C/C++代码
private native String HelloWorld();
public static void main(String[] args) {
System.out.println(new HelloJNI().HelloWorld());
}
}
在终端中输入:
javac -h . HelloJNI.java
生成HelloJNI.class
文件和HelloJNI.h
文件
HelloJNI.h
内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: HelloWorld
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_HelloJNI_HelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
之后我们需要创建HelloJNI.c
或HelloJNI.cpp
文件即可。
这里使用C++编程:
#include "HelloJNI.h"
#include <stdio.h>
#include <jni.h>
JNIEXPORT jstring JNICALL Java_HelloJNI_HelloWorld(JNIEnv *env, jobject obj){
return env->NewStringUTF("JNI, hello world!");
}
输出一句话hello world
然后进行编译生成共享库:
g++ -fpic -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.cpp
最后添加共享库运行Java代码:
java -Djava.library.path=. HelloJNI
结果: