JavaCpp-javacpp

1. 简介

JavaCpp 提供了便捷访问 C/C++ 程序的方法,并且不需要接触 JNI/JNA。

2. 使用流程

  1. 准备映射文件
    用途 @Properties 中的 value = "linux-x86_64"指出在某个平台下该规则,includepathinclude 配合使用的指出头文件的路径,类似的linkpathlink 配合使用指出链接库文件的路径,target 指定生成的对象的路径,global 。再往下发现有个 infoMap 对象,我们往里面添加了很多 Info 对象,Java和 C/C++ 毕竟是两种语言,有些语法或者字段需要手动转换,这时候就需要映射文件手动指定部分规则,具体规则点这里
package top.shellfish.config;

import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.annotation.*;
import org.bytedeco.javacpp.tools.*;

/**
 * @author Shell Fish
 * @version 1.0
 * @since 1.8
 */
@Properties(value = {
        @Platform(
                value = "windows-x86_64",
                includepath = {"D:/cpnproj/hk-lpr/src/main/java/com/alinkx/header/"},
                include = {"DataType.h", "DecodeCardSdk.h", "HCNetSDK.h", "plaympeg4.h"},
                linkpath = {"D:/cpnproj/hk-lpr/src/main/java/top/shellfish/link/"},
                link = {"HCNetSDK.dll"}
        ),
        @Platform(
                value = "linux-x86_64",
                includepath = {"/usr/include/"},
                include = {"DataType.h", "DecodeCardSdk.h", "HCNetSDK.h", "plaympeg4.h"},
                linkpath = {"/usr/lib/"},
                link = {"HCNetSDK.so"}
        )},
        target = "top.shellfish.jni.NativeLibrary",
        global = "top.shellfish.jni.struct"
)
public class Mapper implements InfoMapper {
    static {
        Loader.load(); 
    }
    @Override
    public void map(InfoMap infoMap) {
    }
}

  1. 接下来利用编译我们的 Mapper 文件,当前工作目录处于 top.shellfish 的上一级目录,这个目录要有 Javacpp.jar。我们的 Mapper.java 文件在 top/shellfish/config/ 目录下,
    $ javac -cp javacpp.jar top/shellfish/config/Mapper.java

  2. 生成接口文件
    $ java -jar javacpp.jar top.shellfish.config.Mapper

  3. 如果你的 Mapper.java 文件没有包名,只需一个命令完成 34 步骤
    $ java -jar javacpp.jar Mapper.java

  4. 接口文件生成结果
    image.png

  5. 接下来通过接口文件 NativeLibrary 就能调用 C/C++ 动态库

posted @ 2023-06-20 20:07  Shellfish  阅读(333)  评论(0编辑  收藏  举报