Android-студия Opencascade

Я пытаюсь создать приложение для Android на Opencascade с помощью приведенного ниже URL-адреса.

http://www.opencascade.com/doc/occt-7.0.0/overview/html/samples_java_android_occt.html

Все работает нормально, за исключением того, что я застрял в следующих ошибках:

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"

Я не могу добавить gnustl_shared библиотеку и другие .so files. Пожалуйста, предложите шаги, поскольку приведенная выше ссылка не содержит подробной информации об этом.

Любая помощь будет большим подспорьем. Спасибо.


person Mohammad Tauqir    schedule 13.07.2016    source источник


Ответы (1)


OpenCascade не предоставляет никаких двоичных файлов для создания приложения. Создайте свой собственный двоичный файл .so для Android в ОС Windows:

  1. Внимательно следуйте инструкциям, приведенным здесь Сборка с помощью CMake для Android.
  2. Используйте только Freetype, поставляемый с установщиком Open Cascade. FreeImageи другие для этого образца не требуются.
  3. После успешной настройки и создания файлов CMake следуйте URL-адресу шага 1.
  4. При создании бинарных файлов для Android будет много проблем. Следуйте приведенным ниже трюкам:

    а. Ошибка, связанная с declspec(dllexport) x. Он поставляется в сторонней библиотеке свободного типа, которая поставляется с OCC внутри freetype-x.x.x/include/config/ftoption.h. Это можно решить, закомментировав номер строки (282, если используется OCC 7.0.0), указанный в ошибке, и введя вместо него #define FT_EXPORT_DEF(x) x.

    б. Используйте команду make, чтобы снова начать сборку.

    в. Вставьте freetype.so в freetype-xx/lib. Скопируйте libEGL.so из ..\android-ndk\platforms\android-xx\arch-arm\usr\lib и вставьте в freetype-xx/lib.

    д. Откройте папку inc для выходной папки CMake, указанной на шаге 1. Скопируйте содержимое в ..\android-ndk\platforms\android-xx\arch-arm\usr\include и вставьте в папку inc. Выполните шаг 4.b.

ПРИМЕЧАНИЕ: android-xx зависит от ANDROID_NATIVE_API_LEVEL. Это может быть андроид-15.

  1. Если ошибок нет, продолжайте следовать URL-адресу шага 1.
  2. После успешной установки перейдите в выходной каталог CMake и найдите папку lib во всех подпапках (может быть lin32/gcc/lib). Внутри папки lib будут все необходимые бинарные файлы.
  3. Я создал бинарники. скачайте отсюда и скопируйте двоичные файлы в папку jnilibs в проекте.
  4. Кроме freetype, никакая другая сторонняя библиотека не требуется.

Теперь возвращаясь к вопросу - 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))

ПРИМЕЧАНИЕ:

  1. Используйте последний эксперимент Gradle для образца.

  2. Не забудьте добавить шейдеры в папку Assest. Другие не требуются для этого образца

  3. Я использовал OCC 7.0.0 и последнюю версию Android Studio.

Я прилагаю исходный код и OCC/include.

person Mohammad Tauqir    schedule 15.09.2016