所有平台(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