我是使用本来作出一个应用程序主要是在C性能的原因,但它出现的该文件的操作,如fopen不能正常工作。每当我试图使用这些功能,应用程序的崩溃。

我如何创造写文件与本?

有帮助吗?

解决方案

其他的答案是否正确。您可以使用FILEfopen打开通过NDK文件,但不要忘记将许可它。

在Android清单的地方:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

其他提示

文件IO使用JNI适用于Android细。也许你试图打开一个坏的路径的文件,而不是检查返回代码?我修改了HELLO-JNI例子来证明它确实是可以打开的文件,并写入。我希望这有助于。

/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
#include <string.h>
#include <jni.h>
#include <stdio.h>

/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
 */
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                              jobject thiz )
{
    FILE* file = fopen("/sdcard/hello.txt","w+");

    if (file != NULL)
    {
        fputs("HELLO WORLD!\n", file);
        fflush(file);
        fclose(file);
    }

    return (*env)->NewStringUTF(env, "Hello from JNI (with file io)!");
}

下面是我的电话上运行它之后的结果(具有SD卡):

$ adb -d shell cat /sdcard/hello.txt
HELLO WORLD!

请确保使用Java getExternalStorageDirectory()调用来获取到SD卡的真正路径,因为较新的设备不会简单地把它映射到“/ SD卡”。在这种情况下试图用的硬编码位置“/ SD卡”将失败。

我也可以验证fopen()正常工作,但是 如果你想要访问一个文件在应用程序的资源或财产的文件夹。我建议,为避免具有重新发明轮子,你坚持的任何资产,你想要的随附应用程序中的资产文件夹中,在那里他们会被包装起来进行分配。

在该资产上的文件夹种情况下你需要做两件事情之一,取决于文件是否是通过压缩包装.两者都使用AssetManager方法,并且可以得到的AssetManager从上下文/应用程序。文件名是总是相对于该资产的文件夹,顺便说一句:如果你有一个文件"foo。png"直接在"资产"文件夹,你就打开"foo。png" 像"资产/foo。png".

  1. 如果文件不是压制(即,这一扩展没有得到压缩,等等。png),可以获得的文件描述从AssetManager.openFd()并通过它来C++。然后你就可以使用的流时,也不会(dup(fd),"r");打开文件作为文件*.注意你 必须fseek()对偏移量,并跟踪文件的长度自己。 你真的得到一个文件处理的整个资产包,和你的文件感兴趣的只是一小部分。

  2. 如果你的文件被压缩,需要使用Java流的读者:AssetManager.open()给你一个输入流可以使用的阅读该文件。这是一个太平洋岛屿电信协因为你不能查询(据我所知)的文件大小;我运行一个预处理步骤,在我的资产文件夹中产生名单的所有文件都与他们各自的大小,以便我可以知道,例如,有多大一个缓冲区来分配。

如果你的文件是一种资源,可能需要通过资源流入,虽然它出现的资源也被包装成同样的资产包。资源有openRawResource()呼吁得到的输入流和openRawResourceFd()呼吁获得的文件描述,如上所述,虽然。

好运气。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top