从Android项目中的Native代码中读取文本文件

时间:2014-10-21 02:58:07

标签: android java-native-interface native-code

我搜索了类似的信息,找不到明确的解决方案。所以我在这里询问。 我喜欢从我的本机代码中读取文本文件。 我有两种方法。 (1)第一个文件路径在Java中获取并传递给本机代码

In Java
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
                  String att =  "attr.names";
                  String tree =  "face.tree";
                  File mAttClass = new File(cascadeDir, att);
                  File mTree = new File(cascadeDir, tree); 
                  mNativeDetector.CreateNativeObject_Tree(mAttClass.getAbsolutePath(), mTree.getAbsolutePath());
                  mAttClass.delete();
                  mTree.delete();



In Native C
    void   GetNames(char *Fn)
    /*  ---------  */
    {
        LOGD("Enter getnames \n");
        FILE *Nf, *fopen();
        char Buffer[1000];
        DiscrValue v;
        int AttCeiling=100, ClassCeiling=100, ValCeiling;

        /*  Open names file  */


        if ( ! ( Nf = fopen(Fn, "r") ) )
            Error(0, Fn, "");

     }

此方法将错误设为“无法从/data/data/com.test.pck/app_cascade/attr.names打开文件”。

(2)第二种方法是,文件(attr.names)与JNI文件夹中的源文件位于同一文件夹中。然后使用

加载
if ( ! ( Nf = fopen(Fn, "r") ) )
                Error(0, Fn, "");

错误是“无法从attr.names打开文件”。

如何从我的本机C代码中读取该文本文件。

编辑1: 正如下面的讨论。我需要使用openRawResources()来获取文件描述符,偏移量和大小。 我试着按照以下方式实施。

  int rID = resources.getIdentifier("com.test.pkg:raw/"+attr.names, null, null); 
    InputStream is = resources.openRawResource(rID);
     File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); 
    String temp;
    File mCascadeFile = null;
    temp =  xmlarray[l] + ".xml";
    mCascadeFile = new File(cascadeDir, temp);
    FileOutputStream os = new FileOutputStream(mCascadeFile); 
     byte[] buffer = new byte[4096]; 
     int bytesRead;
      while ((bytesRead = is.read(buffer)) != -1) { 
           os.write(buffer, 0, bytesRead);
      }
      is.close(); 
      os.close();

现在可行。

由于

0 个答案:

没有答案