所有平台(Android、iOS、Linux、Mac OS X、Windows)的构建状态:
自定义预设的商业支持和付费服务:
JavaCPP 预设模块包含广泛使用的 C/C++ 库的 Java 配置和接口类。解析器使用org.bytedeco.<moduleName>.presets
包中的配置文件从 C/C++ 头Parser
创建针对org.bytedeco.<moduleName>
包的 Java 接口文件,这些文件又由解析器使用Generator
和本机 C++ 编译器来生成所需的 JNI 库。此外,帮助程序类使其功能更易于在 Java 平台(包括 Android)上使用。
出于指导目的,该存储库的文档可以被视为分为 2 个级别:
javacpp-presets
模块本身,并且此父 README.md 文件包含适用于所有模块的一般信息,以解决有关下载、常见要求、安装过程和构建说明的问题。每个子目录中各自的 README.md 文件包含有关 API 文档、具体要求、 pom.xml
文件的依赖项以及每个模块的预设和包的示例使用代码的额外信息、链接和注释。请注意,并非所有预设都具有相同的成熟度,并且样式和布局也可能有所不同,因为它们基于第三方库的 API。
有关如何创建新预设的更多信息,请参阅 wiki 页面。由于目前缺乏其他文档,因此也请随时在邮件列表或讨论论坛上提问。
可以从 Maven 中央存储库获取包含所有子模块的二进制文件以及所有受支持平台(Android、iOS、Linux、Mac OS X 和 Windows)的构建的 JAR 文件。包含这些 JAR 文件的存档也可以作为版本提供。
要手动安装 JAR 文件,请按照下面的手动安装部分中的说明进行操作。
我们还可以使用以下命令自动下载和安装所有内容:
pom.xml
文件内) < dependency >
< groupId >org.bytedeco</ groupId >
< artifactId >${moduleName}-platform</ artifactId >
< version >${moduleVersion}-1.5.11</ version >
</ dependency >
build.gradle.kts
或build.gradle
文件内) dependencies {
implementation( " org.bytedeco: $m oduleName -platform: $m oduleVersion -1.5.11 " )
}
project.clj
文件内) :dependencies [
[~( symbol ( str " org.bytedeco/ " moduleName " -platform " )) ~( str moduleVersion " -1.5.11 " )]
]
build.sbt
文件内) libraryDependencies += " org.bytedeco " % moduleName + " -platform " % moduleVersion + " -1.5.11 "
其中moduleName
和moduleVersion
变量对应于所需的模块。这会下载所有平台的二进制文件,但要仅获取一个平台的二进制文件,我们可以将javacpp.platform
系统属性(通过-D
命令行选项)设置为android-arm
、 linux-x86_64
、 macosx-x86_64
、 windows-x86_64
等。我们还可以指定多个平台,请参阅减少依赖项数量中的示例。 Gradle 用户可以使用的另一个选项是 Gradle JavaCPP,同样,Scala 用户可以使用 SBT-JavaCPP。
要使用 JavaCPP 预设,您需要下载并安装以下软件:
此外,对于 Android,JavaCPP 预设还依赖于:
除了javacpp.jar
之外,只需将所有所需的 JAR 文件( opencv*.jar
、 ffmpeg*.jar
等)放在类路径中的某个位置即可。作为预构建工件提供的 JAR 文件旨在与 JavaCPP 一起使用。 Linux 的二进制文件是使用 Ubuntu 构建的,因此它们应该适用于当前使用的大多数发行版。以下是针对常见情况的一些更具体的说明:
NetBeans(Java SE 7 或更高版本):
Eclipse(Java SE 7 或更高版本):
Visual Studio Code(Java SE 7 或更高版本):
+
。IntelliJ IDEA(Android 7.0 或更高版本):
app/libs
子目录中。+
”,然后选择“2 文件依赖项”。libs
子目录中选择所有 JAR 文件。之后,我们可以通过org.bytedeco.<moduleName>
包中的接口类几乎透明地访问相应的 C/C++ API。事实上, Parser
将 C/C++ 头文件中的代码注释转换为 Java 接口文件,(几乎)可供 Javadoc 使用。然而,由于它们的翻译仍然有待改进,因此人们可能希望参考原始文档页面。例如,OpenCV 和 FFmpeg 的可以在线找到:
如果上面提供的二进制文件不足以满足您的需求,您可能需要从源代码重建它们。为此,Java 端的项目文件被创建为 Maven 模块。默认情况下,Maven 构建还会使用cppbuild.sh
脚本在本机 C/C++ 端安装本机库,但也可以通过其他方式安装它们。
此外,您还可以在 wiki 页面上找到有关主要平台的推荐构建环境的更多信息。
JavaCPP 预设依赖于 Maven,这是一个强大的 Java 构建系统,因此在尝试构建之前,请务必安装并阅读:
默认情况下,每个子模块依次依赖于包含的cppbuild.sh
脚本(如下所述),以在cppbuild
子目录中安装其相应的本机库。要使用已安装在系统上其他位置的本机库,还可以在pom.xml
文件或.java
配置文件中指定cppbuild
之外的其他安装目录。支持以下版本:
一旦安装并配置了所有内容,只需执行
$ mvn install --projects .,opencv,ffmpeg,etc. -Djavacpp.platform.root=/path/to/android-ndk/
在包含父pom.xml
文件的目录中,通过在命令中仅指定所需的子模块,但不带前导句点“.”在以逗号分隔的项目列表中,父pom.xml
文件本身可能无法安装。 (仅 Android 构建需要-Djavacpp.platform.root=...
选项。)还要指定-Djavacpp.cppbuild.skip
作为选项以跳过cppbuild.sh
脚本的执行。除了-Djavacpp.platform=...
之外,一些预设还可以使用-Djavacpp.platform.extension=-gpu
针对 CUDA 构建,或者使用-Djavacpp.platform.extension=-python
针对 CPython 构建。请参阅pom.xml
文件内的注释以了解更多详细信息。从“platform”子目录中,我们还可以使用类似的命令安装“platform”工件:
$ cd platform
$ mvn install --projects ../opencv/platform,../ffmpeg/platform,etc. -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 版本才需要ANDROID_NDK
变量。)请注意,脚本会根据需要从适当的站点下载源档案。
要为没有 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++ 头文件,但构建系统可以也得到改善。因此,我正在寻求帮助,特别是以下五项任务(排名不分先后):
Parser
(通过使用 LLVM 和 Clang 的预设?)linux-armhf
等。要做出贡献,请分叉并创建拉取请求,或将您的建议作为新的“问题”发布。预先非常感谢您的贡献!
项目负责人:Samuel Audet samuel.audet at
gmail.com
开发者网站:https://github.com/bytedeco/javacpp-presets
讨论组:http://groups.google.com/group/javacpp-project