JavaCPP 预设
所有平台(Android、iOS、Linux、Mac OS X、Windows)的构建状态:
定制预设的商业支持和付费服务:
简介
JavaCPP预设模块包含广泛使用的C/C++库的Java配置和接口类。org.bytedeco.<moduleName>.presets
包中的配置文件被Parser
用于从C/C++头文件创建针对org.bytedeco.<moduleName>
包的Java接口文件,这些接口文件又被Generator
和本地C++编译器用于生成所需的JNI库。此外,辅助类使其功能在Java平台(包括Android)上更易于使用。
为便于理解,本仓库的文档可以分为两个层级:
- 包含此父级README.md文档的目录属于上层,即
javacpp-presets
模块本身。 - 其中的子目录是实际的子模块,包含它们各自的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.kts
或build.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"
其中moduleName
和moduleVersion
变量对应于所需的模块。这会下载所有平台的二进制文件,但要仅获取一个平台的二进制文件,我们可以将javacpp.platform
系统属性(通过-D
命令行选项)设置为类似android-arm
、linux-x86_64
、macosx-x86_64
、windows-x86_64
等。我们还可以指定多个平台,请参阅减少依赖项数量中的示例。Gradle用户还可以使用Gradle JavaCPP,同样,Scala用户可以使用SBT-JavaCPP。
必需的软件
要使用JavaCPP预设,您需要下载并安装以下软件:
- Java SE 7或更新版本的实现:
- OpenJDK http://openjdk.java.net/install/ 或
- Oracle JDK http://www.oracle.com/technetwork/java/javase/downloads/ 或
- IBM JDK http://www.ibm.com/developerworks/java/jdk/
此外,对于Android,JavaCPP预设还依赖于:
- Android SDK API 24或更新版本 http://developer.android.com/sdk/
手动安装
只需将所有所需的JAR文件(opencv*.jar
、ffmpeg*.jar
等)以及javacpp.jar
放在类路径中的某个位置即可。作为预构建工件提供的JAR文件旨在与JavaCPP一起使用。Linux的二进制文件是用Ubuntu构建的,因此它们应该可以在当前使用的大多数发行版上运行。Android的二进制文件是为配备FPU的ARMv7处理器编译的,因此它们不会在HTC Magic等古老设备或其他一些ARMv6 CPU的设备上运行。以下是一些常见情况的更具体说明:
NetBeans (Java SE 7或更新版本):
- 在"项目"窗口中,右键单击项目的"库"节点,并选择"添加JAR/文件夹..."。
- 找到JAR文件,选择它们,然后单击"确定"。
Eclipse (Java SE 7或更新版本):
- 导航到"项目 > 属性 > Java构建路径 > 库",然后单击"添加外部JAR..."。
- 找到JAR文件,选择它们,然后单击"确定"。
Visual Studio Code (Java SE 7或更新版本):
- 导航到"Java项目 > 引用的库",然后单击
+
。 - 找到JAR文件,选择它们,然后单击"确定"。
IntelliJ IDEA (Android 7.0或更新版本):
- 按照此页面上的说明操作: http://developer.android.com/training/basics/firstapp/
- 将所有JAR文件复制到
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页面上找到有关主要平台推荐的构建环境的其他信息。
Maven模块
JavaCPP预设依赖于Maven(一个强大的Java构建系统),因此在尝试构建之前,请确保安装并了解以下内容:
- Maven 3.x http://maven.apache.org/download.html
- JavaCPP 1.5.10 https://github.com/bytedeco/javacpp
每个子模块默认依赖于包含的cppbuild.sh
脚本(如下所述)来将其相应的原生库安装到cppbuild
子目录中。要使用系统其他地方已安装的原生库,也可以在pom.xml
文件或.java
配置文件中指定除cppbuild
之外的其他安装目录。支持以下版本:
- OpenCV 4.10.x https://opencv.org/releases/
- FFmpeg 7.0.x http://ffmpeg.org/download.html
- FlyCapture 2.13.x https://www.flir.com/products/flycapture-sdk
- Spinnaker 4.0.x https://www.flir.com/products/spinnaker-sdk
- libdc1394 2.2.6 http://sourceforge.net/projects/libdc1394/files/
- libfreenect 0.5.7 https://github.com/OpenKinect/libfreenect
- libfreenect2 0.2.0 https://github.com/OpenKinect/libfreenect2
- librealsense 1.12.x https://github.com/IntelRealSense/librealsense
- librealsense2 2.53.x https://github.com/IntelRealSense/librealsense
- videoInput 0.200 https://github.com/ofTheo/videoInput/
- ARToolKitPlus 2.3.1 https://launchpad.net/artoolkitplus
- Chilitags https://github.com/chili-epfl/chilitags
- flandmark 1.07 https://github.com/uricamic/flandmark
- Arrow 6.0.x https://arrow.apache.org/install/
- HDF5 1.14.x https://www.hdfgroup.org/downloads/
- Hyperscan 5.4.x https://github.com/intel/hyperscan
- LZ4 1.9.x https://github.com/lz4/lz4
- MKL 2024.x https://software.intel.com/mkl
- MKL-DNN 0.21.x https://github.com/oneapi-src/oneDNN
- DNNL 3.5.x https://github.com/oneapi-src/oneDNN
- OpenBLAS 0.3.28 http://www.openblas.net/
- ARPACK-NG 3.9.x https://github.com/opencollab/arpack-ng
- CMINPACK 1.3.9 https://github.com/devernay/cminpack
- FFTW 3.3.10 http://www.fftw.org/download.html
- GSL 2.8 http://www.gnu.org/software/gsl/#downloading
- CPython 3.12.x https://www.python.org/downloads/
- NumPy 2.0.x https://github.com/numpy/numpy
- SciPy 1.14.x https://github.com/scipy/scipy
- Gym 0.26.x https://github.com/openai/gym
- LLVM 18.1.x http://llvm.org/releases/download.html
- libffi 3.4.x https://github.com/libffi/libffi
- libpostal 1.1 https://github.com/openvenues/libpostal
- LibRaw 0.21.x https://www.libraw.org/download
- Leptonica 1.84.x http://www.leptonica.org/download.html
- Tesseract 5.4.x https://github.com/tesseract-ocr/tesseract
- Caffe 1.0 https://github.com/BVLC/caffe
- OpenPose 1.7.0 https://github.com/CMU-Perceptual-Computing-Lab/openpose
- CUDA 12.6.x https://developer.nvidia.com/cuda-downloads
- cuDNN 9.3.x https://developer.nvidia.com/cudnn
- NCCL 2.22.x https://developer.nvidia.com/nccl
- nvCOMP 4.0.x https://developer.nvidia.com/nvcomp
- NVIDIA Video Codec SDK 12.2.x https://developer.nvidia.com/nvidia-video-codec-sdk
- OpenCL 3.0.x https://github.com/KhronosGroup/OpenCL-ICD-Loader
- MXNet 1.9.x https://github.com/apache/incubator-mxnet
- PyTorch 2.3.x https://github.com/pytorch/pytorch
- SentencePiece 0.2.0 https://github.com/google/sentencepiece
- TensorFlow 1.15.x https://github.com/tensorflow/tensorflow
- TensorFlow Lite 2.17.x https://github.com/tensorflow/tensorflow
- TensorRT 10.3.x https://developer.nvidia.com/tensorrt
- Triton Inference Server 2.48.x https://developer.nvidia.com/nvidia-triton-inference-server
- The Arcade Learning Environment 0.8.x https://github.com/mgbellemare/Arcade-Learning-Environment
- DepthAI 2.24.x https://github.com/luxonis/depthai-core
- ONNX 1.16.x https://github.com/onnx/onnx
- nGraph 0.26.0 https://github.com/NervanaSystems/ngraph
- ONNX Runtime 1.18.x https://github.com/microsoft/onnxruntime
- TVM 0.17.x https://github.com/apache/tvm
- Bullet Physics SDK 3.25 https://pybullet.org
- LiquidFun http://google.github.io/liquidfun/
- Qt 5.15.x https://download.qt.io/archive/qt/
- Mono/Skia 2.88.x https://github.com/mono/skia
- cpu_features 0.7.0 https://github.com/google/cpu_features
- ModSecurity 3.0.x https://github.com/SpiderLabs/ModSecurity
- 构建环境的系统API:
- Linux (glibc) https://www.gnu.org/software/libc/
- Mac OS X (XNU libc) https://opensource.apple.com/
- Windows (Win32) https://developer.microsoft.com/en-us/windows/
一旦所有内容都安装和配置完成,只需在包含父级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脚本
运行这些脚本可以让我们轻松地在多个平台上安装本机库,但需要额外的软件:
- 最新版本的Linux、Mac OS X或带有MSYS和Visual Studio的Windows
- Android NDK r18或更高版本 http://developer.android.com/ndk/downloads/ (仅适用于Android构建)
在上述内容正常工作的情况下,这些脚本会作为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