Main.java文件
package com.zero_waring.jni_test;
public class Main {
static {
System.loadLibrary("hello"); // libhello.so
}
private native void sayHello();
public static void main(String[] args) {
// write your code here
new Main().sayHello();
}
}
生成对应.h
javah -classpath ~/IdeaProjects/JniTest/src com.zero_waring.jni_test.Main
编写JNICppImpl.h文件
#ifndef _JNI_CPP_IMPL_
#define _JNI_CPP_IMPL_
#ifdef __cplusplus
extern "C" {
#endif
void sayHello();
#ifdef __cplusplus
}
#endif
#endif
因为要被c调用所以使用extern c
编写JNICppImpl.cpp文件
#include
#include "JNICppImpl.h"
void sayHello() {
std::cout << "this is jni" << std::endl;
}
编译要被java侧调用的com_zero_waring_jni_test_Main.c
#include
#include "com_zero_waring_jni_test_Main.h"
#include "JNICppImpl.h"
JNIEXPORT void JNICALL Java_com_zero_1waring_jni_1test_Main_sayHello (JNIEnv *env, jobject thisObj) {
sayHello(); // invoke C++ function
return;
}
编译生成so
g++ -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -I ./ -shared com_zero_waring_jni_test_Main.c JNICppImpl.cpp -o libhello.so
添加so 库
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
可以看到当前目录下生成libhello.so
添加对应lib文件到java路径
JVM的java.library.path属性即为环境变量Path指定的目录
因为编译我们依赖了IntelliJ IDEA,所以要添加对应动态库路径
点击run,点击Edit Configurations
选中Main
然后在 VM opition中添加
-Djava.library.path=/home/chao/IdeaProjects/JniTest/src/com/zero_waring/jni_test
然后编译就OK了