当前位置: 首页 > 知识库问答 >
问题:

允许本机库中的 C 代码访问 Android 文件目录中的文件

欧阳俊逸
2023-03-14

我有。将文件放入文件夹中的我的文件目录中,即files\myDirectory\myFile.bin

我必须将此文件的路径传递给我的本机库,以便库可以在需要时访问该文件。

如果 c 类结构概述如下,则路径将作为一部分发送:

emxArray_char_T.ByReference myFilePath = emxArray_char_T.ByReference();
myFilePath.data = PTRmyFilePath;
myFilePath.allocatedSize = myFilePathAllocatedSize;
myFilePath.size = myFilePathSize;
myFilePath.numDimensions = 1;
myFilePath.canFreeData = true;

我第一次尝试通过这条路是这样的:

 ParcelFileDescriptor mParcelFileDescriptor = null;
    String getFileNameThatICanUseInNativeCode(String fileName) {
        try {
            String uri = MyApplication.getAppContext().getFilesDir().getAbsolutePath() + File.separator + "myDirectory"+ File.separator + fileName + ".bin";
            mParcelFileDescriptor =
                    MyApplication.getAppContext().getContentResolver().openFileDescriptor(Uri.parse(uri), "r");
            if (mParcelFileDescriptor != null) {
                int fd = mParcelFileDescriptor.getFd();
                return "/proc/self/fd/" + fd;
            }
        }
        catch (FileNotFoundException fne) {
            return "";
        }
        return "";
    }

然后将其传递到结构中,如下所示:

byte[] myFilePathBA = myFilePath.getBytes(StandardCharsets.US_ASCII);

        Pointer PTRmyFilePath = new Memory(myFilePathBA.length + 4);
        PTRmyFilePath.write(0, myFilePathBA, 0, myFilePathBA.length);

        int myFilePathAllocatedSize = getStringSize(myFilePath);

        Pointer PTRmyFilePathSize = new Memory(2 * Native.getNativeSize(Integer.TYPE));
        PTRmyFilePathSize.setInt(0 * Native.getNativeSize(Integer.TYPE), 1);
        PTRmyFilePathSize.setInt(1 * Native.getNativeSize(Integer.TYPE), myFilePathAllocatedSize );

这似乎不起作用?

在C代码中,路径最初在下面的方法中使用:

signed char jopen(const emxArray_char_T *cfilename, const char *cpermission)
{
  static rtRunTimeErrorInfo sb_emlrtRTEI = {
      111,     /* lineNo */
      "cfopen" /* fName */
  };
  emxArray_char_T *ccfilename;
  int i;
  const char *cfilename_data;
  signed char fileid;
  signed char j;
  char *ccfilename_data;
  cfilename_data = cfilename->data;
  fileid = -1;
  j = filedata();
  if (j < 1) {
    yb_rtErrorWithMessageID(sb_emlrtRTEI.fName, sb_emlrtRTEI.lineNo);
  } else {
    FILE *filestar;
    int loop_ub;
    emxInit_char_T(&ccfilename, 2);
    i = ccfilename->size[0] * ccfilename->size[1];
    ccfilename->size[0] = 1;
    ccfilename->size[1] = cfilename->size[1] + 1;
    emxEnsureCapacity_char_T(ccfilename, i);
    ccfilename_data = ccfilename->data;
    loop_ub = cfilename->size[1];
    for (i = 0; i < loop_ub; i++) {
      ccfilename_data[i] = cfilename_data[i];
    }
    ccfilename_data[cfilename->size[1]] = '\x00';
    filestar = fopen(&ccfilename_data[0], cpermission);
    emxFree_char_T(&ccfilename);
    if (filestar != NULL) {
      eml_openfiles[j - 1] = filestar;
      eml_autoflush[j - 1] = true;
      i = j + 2;
      if (j + 2 > 127) {
        i = 127;
      }
      fileid = (signed char)i;
    }
  }
  return fileid;
}

如果有人能帮助我理解如何将这个文件路径传递给这个结构中的C代码,这样它就能工作,本地代码也能访问这个文件。我没有能力操纵代码的本机端。所以任何帮助都将不胜感激。

共有1个答案

宓文斌
2023-03-14

您的 C 代码毫无意义。首先,这不是一个有效的JNI函数,所以Java一开始就不能调用它。其次,它中没有任何地方实际使用传入的 cfilename 参数。当它调用 fopen 时,它会调用

 类似资料:
  • 如何仅在目录中迭代文本文件?到目前为止,我所拥有的是; 这是可行的,但是我必须将.py文件存储在同一个目录(文件夹)中才能使其运行,因此迭代包含了.py文件本身。理想情况下,我想指挥的是:; “查看此子目录/文件夹,并循环访问其中的所有文件” 或。。。 我确信我要求的东西相当直截了当,但我不知道如何继续。可能值得我强调的是,我通过反复试验获得了glob模块,因此,如果这是绕过此特定方法的错误方法,

  • 我正在尝试访问。我已经使用ebconfig将json文件下载到/tmp/目录,以在S3上存储私钥。 但它给了我以下错误 错误:EACCES:权限被拒绝,打开“/tmp/firebaseadminsdk”。json’ 文件中有一段说 第二个条目使用S3Auth身份验证方法从指定的URL下载私钥,并将其保存到/etc/pki/tls/certs/server。钥匙然后,代理服务器可以从此位置读取私钥,

  • null 我的应用程序托管在Google App Engine上,因此默认情况下ADC在服务器上运行时将使用默认服务帐户。我已经尝试通过使用gcloud auth application-default-account登录和使用我的G Suite管理帐户以及我的个人帐户(两者都是GCP项目的所有者)登录来在本地运行这段代码。失败后,我做了一些研究,并意识到要使OAuth2能够访问我的G套件用户数据

  • 问题内容: 我对让Docker能够访问外部文件感兴趣,但是我不希望将它们作为卷包含在内。我需要访问的文件会随着时间变化,这意味着我将需要反复重新安装,除非我只能安装一个目录,而且该目录中的任何内容也会被安装。 我只需要允许将软件程序推送到容器中,以“在”我的本地系统上运行,该软件程序可以访问我的本地系统上的文件。 忠告?除了添加需要作为卷处理的文件之外,还有其他方法吗? 问题答案: 我用以下命令解

  • 我有一个子目录()我想访问的是在我的站点的根文件夹。我看了这里: https://wordpress.stackexchange.com/questions/20152/cannot-access-non-wordpress-subdirectories-as-wordpress-overrides-them-with-a-40 我已经尝试了解决方案,但没有任何效果。 我还尝试将一个单独的文件添加

  • 问题内容: 我有一个图片目录,我想循环浏览并执行一些文件计算。可能只是缺乏睡眠,但是我将如何使用PHP在给定目录中查找,并使用某种for循环遍历每个文件? 谢谢! 问题答案: scandir: 或glob可能更适合您的需求: