Android NDK 应用程序 - 集成文本文件进行部署的最佳方式

标签 android c++ opencv android-ndk java-native-interface

我正在测试集成 C++ 代码的 Android 应用程序的创建。在这个例子中,我使用的是 OpenCV 库

我设置了环境,我也能够编译和部署。该应用程序运行正常。美丽到这里。虽然有一点 UX 问题。该应用程序使用两个 xml 文件:

haarcascade_frontalface_alt.xml
haarcascade_eye_tree_eyeglasses.xml

但目前最终用户需要将它们下载到设备和给定文件夹中,否则应用程序将无法执行相应的检测。 significant part of code到目前为止是以下内容:

JNIEXPORT void JNICALL Java_com_demo_test_opencvsample_OpenCVClass_faceDetection
  (JNIEnv *, jclass, jlong addrRgba){
    Mat& frame = *(Mat*)addrRgba;

    detect(frame);
}

void detect(Mat& frame){
    // these files will be loaded from a specific folder in the phone memory
    String face_cascade_name = "/storage/emulated/0/data/haarcascade_frontalface_alt.xml";
    String eyes_cascade_name = "/storage/emulated/0/data/haarcascade_eye_tree_eyeglasses.xml";
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;

    //-- 1. Load the cascades
    if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return; };
    if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return; };


-> 问题:有没有办法将这两个 xml 文件直接集成到 apk 中,避免最终用户在安装应用程序后不得不在他的设备上单独下载它们?我希望他在安装应用程序和 C++ 代码后直接提供它们,也是因为它们不应该被更改

回答前请注意:我对在最终应用程序中放置两个下载按钮不感兴趣,甚至对拥有完整的 Android 解决方案也不感兴趣。我想使用 C++ 核心维护当前架构

在此先感谢那些愿意提供帮助的人

最佳答案

Assets API 在 android NDK levels 中提到可用,它转发到此页面 android ndk asset_manager.h

在这里它描述了一组类似于 fopen 的 API,它们允许打开 bundle 的 Assets 。

硬编码路径不是管理文件的正确方法,因为不同的设备或 future /过去的操作系统可能会重新排列文件系统。

SO : How to get ExternalDirectory in NDK 显示了一般如何从 NDK 调用 android 函数,特别是如何加载 externalDirectory - sdcard 的根目录(当设备连接到计算机时用户可见。

对于只与您的项目相关的文件(这里似乎就是这种情况),我建议将 xml 文件存储在应用程序目录中,可以通过 jni 从 Context->getFilesDir() 访问(参见 android : Context

  1. 如果您的 xml 文件是静态的,并且不太可能比您的应用程序更频繁地更改,请使用 Assets 。
  2. 如果您的 xml 文件将由应用程序或您自己更新,请使用 getFilesDir()
  3. 如果您想让您的用户看到 XML 文件(并且能够编辑它们?),那么请使用 getExternalDirectory()

关于Android NDK 应用程序 - 集成文本文件进行部署的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45004758/

相关文章:

具有动态内存的类的 C++ 五规则

c++ - FFMPEG。读取帧,处理它,把它输出视频。复制声音流不变

c++ - 使用opencv warpaffine时如何保持白色背景

android - 在可绘制图层列表中调整位图大小

android - Sugar ORM - 更新记录但忽略空值字段

c++ - 如何避免重复初始化 .mex(matlab 编译代码)?

c++ - C++中的IAX注册程序

opencv - 无法向 opencv 添加额外模块(opencv_contrib)

android - 从 Canvas 中获取两个合并的位图

android - 购买消耗品的应用内结算问题