java使用动态链接库
java可以使用native关键字调用第三方库,现在我们简单使用当前两种操作系统的库编写第三方接口来支持java调用
- 先定义好java的对应接口
package chingee.test.dll;
public class HelloWorld {
public native void sayHello();
}
- 使用java命令生成对应接口的Java native inteface,也就是C语言中的头文件
javah -d jni -classpath target/classes -jni chingee.test.dll.HelloWorld
会在jni目录下生成chingee_test_dll_HelloWorld.h,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class chingee_test_dll_HelloWorld */
#ifndef _Included_chingee_test_dll_HelloWorld
#define _Included_chingee_test_dll_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: chingee_test_dll_HelloWorld
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_chingee_test_dll_HelloWorld_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
适用于windows的DLL
- 使用VS创建一个动态链接库项目

- 将上面生成的头文件chingee_test_dll_HelloWorld.h放到项目的根目录下,并将JDK中的jni.h(JAVA_HOME/include)和jni_md.h(JAVA_HOME/include/win32)也放到根目录下
- 修改chingee_test_dll_HelloWorld.h的引用
// #include <jni.h>
#include "jni.h"
- 创建HelloWorld.cpp
#include "pch.h"
#include "HelloWorld.h"
#include "chingee_test_dll_HelloWorld.h"
JNIEXPORT void JNICALL Java_chingee_test_dll_HelloWorld_sayHello
(JNIEnv*, jobject)
{
printf("Hello World!");// 输出 Hello World
}
- 生成dll动态库

- 在项目HelloWorld/x64/Debug可以查看对应文件

适用于linux的SO
TODO
java使用动态库
- 可以将HelloWorld.dll放到java.library.path,java运行时就可以直接使用
- 在代码中热加载HelloWorld.dll
package chingee.test.dll;
import java.io.File;
import java.io.IOException;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) throws IOException {
File directory = new File("");
directory = directory.getCanonicalFile();
directory = new File(directory.getParentFile().getParentFile(), "c++\\HelloWorld\\x64\\Debug\\HelloWorld.dll");
// 1. 直接加载动态链接库
System.load(directory.getAbsolutePath());
// 2. 加载java.library.path中的文件名为Testdll的动态链接库
// System.loadLibrary("Testdll");
HelloWorld helloWorld = new HelloWorld();
helloWorld.sayHello();
}
}
版权声明:本文为chingee_4096原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。