首页 > 解决方案 > 在 Gradle Jitpack 项目中构建 Java JNI

问题描述

我正在努力在开源 Java 项目中使用本机 JNI 代码。

我已经能够使用用于本地构建的 gradle 模型、组件和工具链来拼凑一个工作的build.gradle,但我无法让它为多个目标构建(linux .so 和 mac .dylib - 该项目目前没有支持窗口)。似乎只有新的cpp-library gradle 插件支持 gradle 中的多个目标?该构建现在可以在我的 mac 上运行,并且库从 jar 加载(感谢之前的帖子!)但System.load调用是依赖于目标的(dylib vs so)。

Jitpack构建失败是因为它没有 GCC 或 CLANG?我在jitpack 文档或常见问题解答中找不到有关使用本机组件构建项目的任何内容。我猜它不受支持?

这一切似乎都异常艰难。任何做得好的示例项目都会有很大的帮助!

(如果我可以让构建工作,我将更新许可证以感谢 Lucene 中首先实施 madvise 系统调用来管理页面缓存的人!)

标签: javagradlejava-native-interfacejitpack

解决方案


在联系了一些前同事后,我使用JNR-FFI更加成功。这是与本机库集成的一种更简单的方法,我强烈推荐它。使用JNR-Constants处理常量仍然有点尴尬。不幸的是,我需要的 madv_willneed、madv_sequential 等值目前尚未定义,需要添加。

总体而言,这种新方法比在 gradle 项目中与原生 jni 集成相比有了很大的改进。由于业务逻辑全部在 java 中,因此更容易测试行为,并且 travis 和 jitpack 等工具可以正常工作。

这是 uppend 上功能的完整更改历史记录。


推荐阅读