OpenCascade Android Studio

2024-02-04

我正在尝试借助以下网址在 Opencascade 上构建 Android 应用程序。

http://www.opencascade.com/doc/occt-7.0.0/overview/html/samples_java_android_occt.html 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。请建议步骤,因为上面的链接没有提供有关这些的详细信息。

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


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

  1. 请仔细按照此处给出的步骤进行操作使用 CMake for Android 进行构建 https://dev.opencascade.org/doc/overview/html/occt_dev_guides__building_android.html
  2. 仅供使用Freetype随 Open Cascade 安装程序一起提供。FreeImage此示例不需要其他内容。
  3. 成功配置并生成 CMake 文件后,请按照步骤 1 URL 进行操作。
  4. 为 Android 创建二进制文件时会遇到很多问题。请遵循以下技巧:

    A。相关错误declspec(dllexport) x。它采用内置 OCC 的 3rd 方库 freetypefreetype-x.x.x/include/config/ftoption.h。可以通过注释掉错误中给出的行号(如果使用 OCC 7.0.0,则为 282)并输入来解决#define FT_EXPORT_DEF(x) x代替它。

    b.使用 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 操作。

NOTE:android-xx 取决于 ANDROID_NATIVE_API_LEVEL。它可以是 android-15。

  1. 如果没有错误,则继续按照步骤 1 URL 进行操作。
  2. 安装成功后,转到 CMake 输出目录并在任何子文件夹中查找 lib 文件夹(可能是 lin32/gcc/lib)。 lib 文件夹内包含所有必需的二进制文件。
  3. 我已经创建了二进制文件。从这里下载 https://www.dropbox.com/sh/0bzx0t25qpcfg97/AACdCNuRMQzCsNcqRL58e7l-a?dl=0并将二进制文件复制到jnilibs项目中的文件夹。
  4. 除了 freetype 之外,不需要其他第三方库。

现在回到问题——gnustl_shared不需要作为外部二进制文件添加。

Inside 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'
}

Inside 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

For OcctJniActivity.java remove freeimage。代替TKJniSample

     // application code
     || !loadLibVerbose ("OcctJni_Viewer",  aLoaded, aFailed))

NOTE :

  1. 使用最新的 gradle 实验作为示例。

  2. 不要忘记在资产文件夹中添加着色器。此示例不需要其他内容

  3. 我使用过OCC 7.0.0和最新的Android Studio。

我正在附加源代码 https://www.dropbox.com/s/dt06jkatcr5b5b2/OcctJniViewer.zip?dl=0 and OCC/包括 https://www.dropbox.com/s/1luz4j3hskfmgh4/inc.zip?dl=0 folder.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCascade Android Studio 的相关文章

  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • 如何在android中实现触摸平滑图像橡皮擦?

    我已经从 API 演示中看到了finturePaint java 我想实现触摸平滑橡皮擦 通过在android中触摸移动来擦除部分图像 FingerPaint 告诉我要实现这个 mPaint setXfermode new PorterDu
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch

随机推荐