OpenCascade 不提供任何用于构建应用程序的二进制文件。
在 Windows 操作系统中为 Android 构建您自己的 .so 二进制文件:
- 请仔细按照此处给出的步骤进行操作使用 CMake for Android 进行构建 https://dev.opencascade.org/doc/overview/html/occt_dev_guides__building_android.html
- 仅供使用
Freetype
随 Open Cascade 安装程序一起提供。FreeImage
此示例不需要其他内容。
- 成功配置并生成 CMake 文件后,请按照步骤 1 URL 进行操作。
-
为 Android 创建二进制文件时会遇到很多问题。请遵循以下技巧:
A。相关错误declspec(dllexport) x
。它采用内置 OCC 的 3rd 方库 freetypefreetype-x.x.x/include/config/ftoption.h
。可以通过注释掉错误中给出的行号(如果使用 OCC 7.0.0,则为 282)并输入来解决#define FT_EXPORT_DEF(x) x
代替它。
b.使用 make 命令再次开始构建。
C。将 freetype.so 粘贴到freetype-xx/lib
。复制 libEGL.so 从..\android-ndk\platforms\android-xx\arch-arm\usr\lib
并将其粘贴到freetype-xx/lib
.
d.打开步骤 1 中给出的 CMake 输出文件夹的 inc 文件夹。将内容复制到..\android-ndk\platforms\android-xx\arch-arm\usr\include
并粘贴到 inc 文件夹中。按照步骤 4.b 操作。
NOTE:android-xx 取决于 ANDROID_NATIVE_API_LEVEL。它可以是 android-15。
- 如果没有错误,则继续按照步骤 1 URL 进行操作。
- 安装成功后,转到 CMake 输出目录并在任何子文件夹中查找 lib 文件夹(可能是 lin32/gcc/lib)。 lib 文件夹内包含所有必需的二进制文件。
- 我已经创建了二进制文件。从这里下载 https://www.dropbox.com/sh/0bzx0t25qpcfg97/AACdCNuRMQzCsNcqRL58e7l-a?dl=0并将二进制文件复制到
jnilibs
项目中的文件夹。
- 除了 freetype 之外,不需要其他第三方库。
现在回到问题——gnustl_shared
不需要作为外部二进制文件添加。
Inside app\build.gradle
使用下面的代码
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 24
buildToolsVersion = "24.0.2"
defaultConfig.with {
applicationId = "com.occ_poc_as"
minSdkVersion.apiLevel = 21
targetSdkVersion.apiLevel = 24
versionCode = 1
versionName = "1.0"
}
buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-android.txt'))
}
}
ndk {
moduleName = "OcctJni_Viewer"
cppFlags.add("-I${file(getOpenCascadeDir())}".toString())
cppFlags.add("-frtti")
cppFlags.add("-fexceptions")
stl = "gnustl_shared"
toolchain = 'clang'
ldLibs.addAll(['android', 'log', 'EGL', 'GLESv2'])
cppFlags.addAll(['-Wall', '-std=c++11'])
CFlags.addAll(['-Wall', '-std=c++11'])
}
productFlavors {
// for detailed abiFilter descriptions, refer to "Supported ABIs" @
// https://developer.android.com/ndk/guides/abis.html#sa
create("arm7") {
ndk.with {
abiFilters.add("armeabi-v7a")
ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString())
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "\\src\\main\\jniLibs\\armeabi-v7a\\"
ldLibs.add(libsDir + "libfreetype.so")
ldLibs.add(libsDir + "libTKBRep.so")
ldLibs.add(libsDir + "libTKernel.so")
ldLibs.add(libsDir + "libTKG2d.so")
ldLibs.add(libsDir + "libTKG3d.so")
ldLibs.add(libsDir + "libTKGeomAlgo.so")
ldLibs.add(libsDir + "libTKGeomBase.so")
ldLibs.add(libsDir + "libTKMath.so")
ldLibs.add(libsDir + "libTKPrim.so")
ldLibs.add(libsDir + "libTKTopAlgo.so")
ldLibs.add(libsDir + "libTKBO.so")
ldLibs.add(libsDir + "libTKBool.so")
ldLibs.add(libsDir + "libTKFillet.so")
ldLibs.add(libsDir + "libTKHLR.so")
ldLibs.add(libsDir + "libTKIGES.so")
ldLibs.add(libsDir + "libTKMesh.so")
ldLibs.add(libsDir + "libTKOffset.so")
ldLibs.add(libsDir + "libTKOpenGl.so")
ldLibs.add(libsDir + "libTKService.so")
ldLibs.add(libsDir + "libTKShHealing.so")
ldLibs.add(libsDir + "libTKSTEP.so")
ldLibs.add(libsDir + "libTKSTEP209.so")
ldLibs.add(libsDir + "libTKSTEPAttr.so")
ldLibs.add(libsDir + "libTKSTEPBase.so")
ldLibs.add(libsDir + "libTKV3d.so")
ldLibs.add(libsDir + "libTKXSBase.so")
}
}
}
}
}
def getOpenCascadeDir() {
Properties properties = new Properties()
properties.load(new File(rootDir.absolutePath + "/local.properties").newDataInputStream())
def externalModuleDir = properties.getProperty('occ.dir', null)
if (externalModuleDir == null) {
throw new GradleException(
"OpenCascade location not found. Define location with occ.dir in the local.properties file!")
}
return externalModuleDir
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar', '.so'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
}
Inside local.properties
添加以下片段。
sdk.dir=D\:\\Software\\android_sdk
ndk.dir=D\:\\Software\\android-ndk-r12b-windows-x86_64\\android-ndk-r12b
occ.dir=D\:\\Workspace\\OCCT\\inc
For OcctJniActivity.java
remove freeimage
。代替TKJniSample
和
// application code
|| !loadLibVerbose ("OcctJni_Viewer", aLoaded, aFailed))
NOTE :
使用最新的 gradle 实验作为示例。
不要忘记在资产文件夹中添加着色器。此示例不需要其他内容
我使用过OCC 7.0.0和最新的Android Studio。
我正在附加源代码 https://www.dropbox.com/s/dt06jkatcr5b5b2/OcctJniViewer.zip?dl=0 and OCC/包括 https://www.dropbox.com/s/1luz4j3hskfmgh4/inc.zip?dl=0 folder.