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

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

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

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多