java使用动态链接库

java使用动态链接库

java可以使用native关键字调用第三方库,现在我们简单使用当前两种操作系统的库编写第三方接口来支持java调用

  1. 先定义好java的对应接口
package chingee.test.dll;

public class HelloWorld {

    public native void sayHello();

}
  1. 使用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

  1. 使用VS创建一个动态链接库项目
    创建DLL项目
  2. 将上面生成的头文件chingee_test_dll_HelloWorld.h放到项目的根目录下,并将JDK中的jni.h(JAVA_HOME/include)和jni_md.h(JAVA_HOME/include/win32)也放到根目录下
  3. 修改chingee_test_dll_HelloWorld.h的引用
// #include <jni.h>
#include "jni.h"
  1. 创建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
}
  1. 生成dll动态库
    生成debug的dll库
  2. 在项目HelloWorld/x64/Debug可以查看对应文件
    HelloWorld.dll

适用于linux的SO

TODO

java使用动态库

  1. 可以将HelloWorld.dll放到java.library.path,java运行时就可以直接使用
  2. 在代码中热加载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版权协议,转载请附上原文出处链接和本声明。