Opencascade Android Studio
android-ndk jni (1)
Estoy intentando crear una aplicación de Android en Opencascade con la ayuda de la URL siguiente.
http://www.opencascade.com/doc/occt-7.0.0/overview/html/samples_java_android_occt.html
Todo funciona bien, salvo que estoy atascado en los siguientes errores:
07-12 17:13:09.711: E/occtJniViewer(16333): Error: native library "gnustl_shared" is unavailable:
07-12 17:13:09.711: E/occtJniViewer(16333): dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn''t find "libgnustl_shared.so"
Error: native library "freetype" is unavailable:
07-12 17:13:09.711: E/occtJniViewer(16333): dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn''t find "libfreetype.so"
Error: native library "freeimage" is unavailable:
07-12 17:13:09.711: E/occtJniViewer(16333): dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn''t find "libfreeimage.so"
Error: native library "TKernel" is unavailable:
07-12 17:13:09.711: E/occtJniViewer(16333): dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn''t find "libTKernel.so"
No puedo agregar la biblioteca gnustl_shared
y otros .so files
. Sugiera pasos ya que el enlace anterior no proporciona muchos detalles sobre estos.
Cualquier ayuda será de gran ayuda. Gracias.
OpenCascade no proporciona ningún binario para compilar una aplicación. Cree su propio archivo .so binarios para Android en el sistema operativo Windows:
- Siga los pasos cuidadosamente dados aquí Construyendo con CMake para Android
- Use solo
Freetype
que viene con el instalador de Open Cascade.FreeImage
y otros no son necesarios para esta muestra. - Después de una configuración exitosa y generación de archivos CMake, siga el paso 1 URL.
Habrá muchos problemas al crear archivos binarios para Android. Sigue los trucos a continuación:
a. Error relacionado con
declspec(dllexport) x
. Viene en un freetype de biblioteca de terceros que viene con OCC dentro defreetype-xxx/include/config/ftoption.h
. Se puede resolver comentando el número de línea (282 si se usa OCC 7.0.0) proporcionado en el error y escribiendo#define FT_EXPORT_DEF(x) x
en lugar de este.segundo. Use el comando make para comenzar a construir nuevamente.
do. Pegue freetype.so en
freetype-xx/lib
. Copie libEGL.so desde../android-ndk/platforms/android-xx/arch-arm/usr/lib
y péguelo enfreetype-xx/lib
.re. Abra la carpeta inc para la carpeta de salida CMake que se proporciona en el paso 1. Copie los contenidos en
../android-ndk/platforms/android-xx/arch-arm/usr/include
y péguelo en la carpeta inc. Siga el paso 4.b.
NOTA : android-xx depende de ANDROID_NATIVE_API_LEVEL. Puede ser android-15.
- Si no hay errores, continúe siguiendo la URL del paso 1.
- Después de una instalación exitosa, vaya a CMake el directorio de salida y busque la carpeta lib en cualquier subcarpeta (puede ser lin32 / gcc / lib). Dentro de la carpeta lib todos los archivos binarios requeridos estarán allí.
- Creé los binarios. descarga desde aquí y copia los binarios en la carpeta
jnilibs
en el proyecto. - Además de freetype, no se requiere otra biblioteca de terceros.
Ahora volviendo a la pregunta: gnustl_shared
no se ha vuelto a agregar como un binario externo.
Dentro de la app/build.gradle
use debajo del código
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''
}
Dentro de local.properties
agrega los siguientes fragmentos.
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
Para OcctJniActivity.java
eliminar la imagen freeimage
. reemplace TKJniSample
con
// application code
|| !loadLibVerbose ("OcctJni_Viewer", aLoaded, aFailed))
NOTA :
Use el último experimento de gradle para la muestra.
No olvides agregar Shaders en la carpeta assest. Otros no son necesarios para esta muestra
He usado OCC 7.0.0 y el último Android Studio.
Adjunto el código fuente y la carpeta OCC / include .