Project Icon

javacpp-presets

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

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

JavaCPP 预设

Gitter Maven Central Sonatype Nexus (快照版)
所有平台(Android、iOS、Linux、Mac OS X、Windows)的构建状态: 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 定制预设的商业支持和付费服务: 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

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

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

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号