javacpp-presets

javacpp-presets

简化Java与C/C++库的跨平台集成

JavaCPP Presets为常用C/C++库提供Java配置和接口类。该项目通过预设配置自动生成Java接口,并使用JNI实现原生功能调用。支持Android、iOS、Linux、macOS和Windows等多个平台,显著简化了Java开发中C/C++库的使用。开发者可以方便地集成机器学习、计算机视觉等领域的原生库,提高跨语言开发效率。

JavaCPP预设JavaC++接口Github开源项目

JavaCPP 预设

Gitter Maven Central Sonatype Nexus (快照版)
<sup>所有平台(Android、iOS、Linux、Mac OS X、Windows)的构建状态:</sup> opencv ffmpeg flycapture spinnaker libdc1394 libfreenect libfreenect2 librealsense librealsense2 videoinput artoolkitplus chilitags flandmark arrow hdf5 hyperscan lz4 mkl mkl-dnn dnnl openblas arpack-ng cminpack fftw gsl cpython numpy scipy gym llvm libffi libpostal libraw leptonica tesseract caffe openpose cuda nvcodec opencl mxnet pytorch sentencepiece tensorflow tensorflow-lite tensorrt tritonserver ale depthai onnx ngraph onnxruntime tvm bullet liquidfun qt skia cpu_features modsecurity systems <sup>定制预设的商业支持和付费服务:</sup> xscode

简介

JavaCPP预设模块包含广泛使用的C/C++库的Java配置和接口类。org.bytedeco.<moduleName>.presets包中的配置文件被Parser用于从C/C++头文件创建针对org.bytedeco.<moduleName>包的Java接口文件,这些接口文件又被Generator和本地C++编译器用于生成所需的JNI库。此外,辅助类使其功能在Java平台(包括Android)上更易于使用。

为便于理解,本仓库的文档可以分为两个层级:

  1. 包含此父级README.md文档的目录属于上层,即javacpp-presets模块本身。
  2. 其中的子目录是实际的子模块,包含它们各自的README.md文件、预设和包,作为下层。

这个父级README.md文件包含适用于所有模块的通用信息,用于解决下载、通用要求、安装过程和构建说明等问题。每个子目录中的相应README.md文件包含有关API文档、特定要求、pom.xml文件的依赖关系以及每个模块的预设和包的示例使用代码的额外信息、链接和注释。请注意,并非所有预设都具有相同的成熟度,由于它们基于第三方库的API,样式和布局也可能有所不同。

请参阅wiki页面了解有关如何创建新预设的更多信息。由于目前缺乏额外的文档,请随时在邮件列表讨论论坛上提问。

下载

包含所有子模块二进制文件和所有支持平台(Android、iOS、Linux、Mac OS X和Windows)构建的JAR文件可以从Maven中央仓库获取。包含这些JAR文件的归档文件也可作为发布版本提供。

要手动安装JAR文件,请按照下面手动安装部分的说明进行操作。

我们也可以通过以下方式自动下载和安装所有内容:

  • Maven (在pom.xml文件中)
<dependency> <groupId>org.bytedeco</groupId> <artifactId>${moduleName}-platform</artifactId> <version>${moduleVersion}-1.5.10</version> </dependency>
  • Gradle (在build.gradle.ktsbuild.gradle文件中)
dependencies { implementation("org.bytedeco:$moduleName-platform:$moduleVersion-1.5.10") }
  • Leiningen (在project.clj文件中)
:dependencies [ [~(symbol (str "org.bytedeco/" moduleName "-platform")) ~(str moduleVersion "-1.5.10")] ]
  • sbt (在build.sbt文件中)
libraryDependencies += "org.bytedeco" % moduleName + "-platform" % moduleVersion + "-1.5.10"

其中moduleNamemoduleVersion变量对应于所需的模块。这会下载所有平台的二进制文件,但要仅获取一个平台的二进制文件,我们可以将javacpp.platform系统属性(通过-D命令行选项)设置为类似android-armlinux-x86_64macosx-x86_64windows-x86_64等。我们还可以指定多个平台,请参阅减少依赖项数量中的示例。Gradle用户还可以使用Gradle JavaCPP,同样,Scala用户可以使用SBT-JavaCPP

必需的软件

要使用JavaCPP预设,您需要下载并安装以下软件:

此外,对于Android,JavaCPP预设还依赖于:

手动安装

只需将所有所需的JAR文件(opencv*.jarffmpeg*.jar等)以及javacpp.jar放在类路径中的某个位置即可。作为预构建工件提供的JAR文件旨在与JavaCPP一起使用。Linux的二进制文件是用Ubuntu构建的,因此它们应该可以在当前使用的大多数发行版上运行。Android的二进制文件是为配备FPU的ARMv7处理器编译的,因此它们不会在HTC Magic等古老设备或其他一些ARMv6 CPU的设备上运行。以下是一些常见情况的更具体说明:

NetBeans (Java SE 7或更新版本):

  1. 在"项目"窗口中,右键单击项目的"库"节点,并选择"添加JAR/文件夹..."。
  2. 找到JAR文件,选择它们,然后单击"确定"。

Eclipse (Java SE 7或更新版本):

  1. 导航到"项目 > 属性 > Java构建路径 > 库",然后单击"添加外部JAR..."。
  2. 找到JAR文件,选择它们,然后单击"确定"。

Visual Studio Code (Java SE 7或更新版本):

  1. 导航到"Java项目 > 引用的库",然后单击+
  2. 找到JAR文件,选择它们,然后单击"确定"。

IntelliJ IDEA (Android 7.0或更新版本):

  1. 按照此页面上的说明操作: http://developer.android.com/training/basics/firstapp/
  2. 将所有JAR文件复制到app/libs子目录中。
  3. 导航到"文件 > 项目结构 > 应用 > 依赖项",单击+,然后选择"2 文件依赖项"。
  4. libs子目录中选择所有JAR文件。

之后,我们可以几乎透明地通过org.bytedeco.<moduleName>包中的接口类访问相应的C/C++ API。实际上,Parser将C/C++头文件中的代码注释翻译成Java接口文件,(几乎)可以直接被Javadoc使用。但是,由于它们的翻译仍有待改进,人们可能希望参考原始文档页面。例如,OpenCV和FFmpeg的文档可以在线找到:

构建说明

如果上面提供的二进制文件不能满足您的需求,您可能需要从源代码重新构建它们。为此,Java端的项目文件作为Maven模块创建。默认情况下,Maven构建还通过cppbuild.sh脚本在本地C/C++端安装原生库,但也可以通过其他方式安装。

此外,可以在wiki页面上找到有关主要平台推荐的构建环境的其他信息。

Maven模块

JavaCPP预设依赖于Maven(一个强大的Java构建系统),因此在尝试构建之前,请确保安装并了解以下内容:

每个子模块默认依赖于包含的cppbuild.sh脚本(如下所述)来将其相应的原生库安装到cppbuild子目录中。要使用系统其他地方已安装的原生库,也可以在pom.xml文件或.java配置文件中指定除cppbuild之外的其他安装目录。支持以下版本:

一旦所有内容都安装和配置完成,只需在包含父级pom.xml文件的目录中执行以下命令:

$ mvn install --projects .,opencv,ffmpeg,等 -Djavacpp.platform.root=/path/to/android-ndk/

通过在命令中仅指定所需的子模块,但不要在逗号分隔的项目列表中包含前导句点".",否则父级pom.xml文件本身可能不会被安装。(-Djavacpp.platform.root=...选项仅适用于Android构建。)同时指定-Djavacpp.cppbuild.skip选项可跳过cppbuild.sh脚本的执行。除了-Djavacpp.platform=...之外,某些预设还可以使用-Djavacpp.platform.extension=-gpu或CPython与-Djavacpp.platform.extension=-python一起构建。详细信息请参阅pom.xml文件中的注释。从"platform"子目录中,我们还可以使用类似的命令安装"platform"构件:

$ cd platform $ mvn install --projects ../opencv/platform,../ffmpeg/platform,等 -Djavacpp.platform.host

cppbuild.sh脚本

运行这些脚本可以让我们轻松地在多个平台上安装本机库,但需要额外的软件:

在上述内容正常工作的情况下,这些脚本会作为Maven构建生命周期的一部分自动启动,但我们也可以手动执行

$ ANDROID_NDK=/path/to/android-ndk/ bash cppbuild.sh [-platform <name>] [-extension <name>] <install | clean> [projects]

其中可能的平台名称包括:

  • android-arm
  • android-arm64
  • android-x86
  • android-x86_64
  • ios-arm64
  • ios-x86_64
  • linux-armhf
  • linux-arm64
  • linux-ppc64le
  • linux-x86
  • linux-x86_64
  • macosx-arm64
  • macosx-x86_64
  • windows-x86
  • windows-x86_64

某些构建支持的-gpu扩展还需要安装CUDA。(ANDROID_NDK变量仅适用于Android构建。)请注意,脚本会根据需要从适当的网站下载源代码存档。

要为没有FPU的Android设备编译二进制文件,首先确保这是你想要的。没有FPU,OpenCV或FFmpeg的性能都会非常差。如果你仍然希望继续,那么在各个文件中将"armeabi-v7a"替换为"armeabi",并将"-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"替换为"-march=armv5te -mtune=xscale -msoft-float"。

虽然JavaCPP可以拾取系统上安装的本机库,但这些脚本的存在是为了简化跨多个平台的构建过程。它们还允许JavaCPP从上面Maven创建的JAR文件中复制本机库并在运行时加载它们,这对独立应用程序或Java小程序来说是一个有用的功能。此外,以下技巧适用于JNLP:

<resources os="Linux" arch="x86 i386 i486 i586 i686"> <jar href="lib/opencv-linux-x86.jar"/> <jar href="lib/ffmpeg-linux-x86.jar"/> </resources> <resources os="Linux" arch="x86_64 amd64"> <jar href="lib/opencv-linux-x86_64.jar"/> <jar href="lib/ffmpeg-linux-x86_64.jar"/> </resources>

感谢Jose Gómez对此进行测试!

我如何提供帮助?

非常欢迎任何形式的贡献!目前,Parser的功能有限,所以我计划逐步改进它,使其能够成功解析比OpenCV、Caffe或TensorFlow更复杂的大型C++头文件,但构建系统也可以改进。因此,我特别希望在以下五个任务方面得到帮助,没有特定顺序:

  • 设置持续集成,最好是在云端免费进行(使用Travis CI?)
  • 改进Parser(通过使用LLVM和Clang的预设?)
  • 为更多平台提供构建,如为树莓派提供linux-armhf
  • 用更易使用的方式替换Bash/Maven构建组合(使用Gradle?)
  • 为其他C/C++库(如Caffe2、OpenNI、OpenMesh、PCL等)添加新的预设作为子模块

如需贡献,请fork并创建pull requests,或者以新"issue"的形式发表您的建议。非常感谢您的贡献!


项目负责人:Samuel Audet samuel.audet at gmail.com
开发者网站:https://github.com/bytedeco/javacpp-presets
讨论组:http://groups.google.com/group/javacpp-project

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多