OpenCascade 不提供任何用于构建应用程序的二进制文件。在 Windows 操作系统中为 Android 构建您自己的 .so 二进制文件:
- 仔细按照此处使用 CMake for Android 构建的步骤进行操作
- 仅
Freetype
使用 Open Cascade 安装程序附带的。FreeImage
此示例不需要其他内容。
- 成功配置和生成 CMake 文件后,按照步骤 1 URL。
在为 Android 创建二进制文件时会有很多问题。请遵循以下技巧:
一个。相关的错误declspec(dllexport) x
。它采用内置 OCC 的 3rd 方库 freetype freetype-x.x.x/include/config/ftoption.h
。它可以通过注释掉错误中给出的行号(如果使用 OCC 7.0.0 则为 282)并#define FT_EXPORT_DEF(x) x
代替它输入来解决。
湾。使用 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。
注意:android-xx 取决于 ANDROID_NATIVE_API_LEVEL。它可以是 android-15。
- 如果没有错误,则继续执行步骤 1 URL。
- 安装成功后,进入 CMake 输出目录并在所有子文件夹中查找 lib 文件夹(可能是 lin32/gcc/lib)。在 lib 文件夹中,所有必需的二进制文件都将在那里。
- 我已经创建了二进制文件。从这里下载
jnilibs
并复制项目文件夹中的二进制文件。
- 除了 freetype 之外,不需要其他 3rd 方库。
现在回到问题 -gnustl_shared
不需要添加为外部二进制文件。
内部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'
}
在里面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
对于OcctJniActivity.java
删除freeimage
. 替换TKJniSample
为
// application code
|| !loadLibVerbose ("OcctJni_Viewer", aLoaded, aFailed))
注意:
对样本使用最新的 gradle 实验。
不要忘记在 assest 文件夹中添加着色器。此示例不需要其他
我使用过 OCC 7.0.0 和最新的 Android Studio。
我正在附加源代码和OCC/include文件夹。