android android-ndk jni opencascade
OCC / includecódigo fuente

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:

  1. Siga los pasos cuidadosamente dados aquí Construyendo con CMake para Android
  2. Use solo Freetype que viene con el instalador de Open Cascade. FreeImage y otros no son necesarios para esta muestra.
  3. Después de una configuración exitosa y generación de archivos CMake, siga el paso 1 URL.
  4. 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 de freetype-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 en freetype-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.

  1. Si no hay errores, continúe siguiendo la URL del paso 1.
  2. 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í.
  3. Creé los binarios. descarga desde aquí y copia los binarios en la carpeta jnilibs en el proyecto.
  4. 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 :

  1. Use el último experimento de gradle para la muestra.

  2. No olvides agregar Shaders en la carpeta assest. Otros no son necesarios para esta muestra

  3. He usado OCC 7.0.0 y el último Android Studio.

Adjunto el código fuente y la carpeta OCC / include .