首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Opencascade Android Studio

Opencascade Android Studio
EN

Stack Overflow用户
提问于 2016-07-13 10:30:33
回答 1查看 935关注 0票数 1

我正试图在下面的url帮助下在Opencascade上构建一个Android应用程序。

occt.html

除了我陷入以下错误之外,一切都很好:

代码语言:javascript
运行
复制
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。请建议步骤,因为上面的链接并没有提供更多的细节。

任何帮助都会有很大帮助。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 06:36:55

OpenCascade不提供任何用于构建应用程序的二进制文件。在Windows中为Android构建自己的.so二进制文件:

  1. 遵循这里给出的步骤,用CMake构建安卓系统
  2. 只使用Open安装程序附带的Freetype。此示例不需要FreeImage和其他内容。
  3. 在成功配置和生成CMake文件之后,请按照步骤1 URL操作。
  4. 在为Android创建二进制文件时会出现很多问题。请遵循以下技巧: a.与declspec(dllexport) x相关的错误。它是在freetype-x.x.x/include/config/ftoption.h内部随OCC一起提供的第三方库免费版。它可以通过注释掉错误中给定的行号(如果使用OCC7.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中。 为步骤1中给出的CMake输出文件夹打开inc文件夹。复制..\android-ndk\platforms\android-xx\arch-arm\usr\include中的内容并粘贴到inc文件夹中。按照步骤4.b。

注意到:android依赖于ANDROID_NATIVE_API_LEVEL。可以是android-15。

  1. 如果没有错误,那么继续遵循步骤1的URL。
  2. 安装成功后,转到CMake输出目录,并在任何子文件夹中查找lib文件夹(可能是lin32/gcc/lib)。在lib文件夹中,所有必需的二进制文件都在那里。
  3. 我创建了二进制文件。从这里下载并在项目中的jnilibs文件夹中复制二进制文件。
  4. 除了自由类型之外,不需要其他第三方库。

现在回到问题- gnustl_shared不适合作为外部二进制文件添加。

app\build.gradle内部使用下面的代码

代码语言:javascript
运行
复制
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内部添加下面的代码段。

代码语言:javascript
运行
复制
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替换为

代码语言:javascript
运行
复制
     // application code
     || !loadLibVerbose ("OcctJni_Viewer",  aLoaded, aFailed))

备注

  1. 样本使用最新的分级实验。
  2. 别忘了把阴影添加到最棒的文件夹中。此示例不需要其他示例。
  3. 我使用了OCC7.0.0和最新的Android。

我正在附加源代码OCC/包括文件夹。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38349139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档