Soubor operace v Android NDK

hlasů
57

Já jsem za použití Android NDK podat žádost především v C z důvodů výkonu, ale zdá se, že je soubor operací, jako fopen nefungují správně v systému Android. Kdykoliv se snažím používat tyto funkce, dojde k chybě aplikace.

Jak mohu vytvořit / zápis do souboru s Android NDK?

Položena 02/01/2010 v 22:40
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
57

File IO funguje na Androidu používat JNI. Možná se pokoušíte otevřít soubor s špatnou cestou, a ne kontrola návratový kód? Upravil jsem Hello-JNI příklad prokázat, že je skutečně možné otevřít soubor a zapisovat do něj. Doufám, že to pomůže.

/*
 * 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)!");
}

Zde je výsledek po spuštění to na můj telefon (s kartou SD):

$ adb -d shell cat /sdcard/hello.txt
HELLO WORLD!
Odpovězeno 03/01/2010 v 01:01
zdroj uživatelem

hlasů
51

Vše výše uvedené je správný. Můžete otevřít soubor prostřednictvím NDK pomocí souborů a fopen. ALE ... Dont zapomenout umístit povolení pro něj. v Android manifestu umístit

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
Odpovězeno 01/11/2010 v 11:31
zdroj uživatelem

hlasů
19

Také mohu ověřit, že fopen () funguje správně, ale ne v případě, že se snažíte o přístup k souboru ve zdrojích dané aplikace nebo složky majetku. Doporučuji, aby nemuseli znovu vynalézat kolo, že se budete držet žádné podklady, které chcete dodán s aplikací ve složce aktiv, kde se bude zabalen až k distribuci.

V případě složek majetku, co musíte udělat jednu ze dvou věcí, v závislosti na tom, zda byl soubor komprimován balírny. Oba používají metody AssetManager, a můžete získat AssetManager z kontextového / app. Jména souborů jsou vždy relativní ke složce aktiv, btw: máte-li soubor „foo.png“ přímo ve složce majetku, měli byste otevřít „foo.png“, ne něco jako „aktiva / foo.png“.

  1. V případě, že soubor nebyl stlačený (tj, že je to jedna z rozšíření, která nedostane stlačené, jako PNG), můžete získat popisovač souboru z AssetManager.openFd () a předat jej do C ++. Pak můžete využít fdopen (dup (FD), "r"); otevřít soubor jako soubor *. Všimněte si, musí fseek () pro posun, a sledovat délku souboru sami. Jste opravdu dostat popisovač souboru na celý balík aktiv, a soubor zájmů je jen malá část.

  2. Je-li váš soubor komprimovaný, musíte použít čtečku Java streaming: AssetManager.open () vám dává InputStream můžete použít soubor ve čtení Je to PITA protože nemůžete dotaz (pokud vím), velikost souboru;. Vedu předzpracování krok na mé složce aktiv, která vytváří seznam všech souborů s jejich velikostí, takže můžu vědět, například, jak velká je z vyrovnávací paměti přidělit.

Pokud váš soubor je zdroj, budete muset projít třídu zdrojů k němu přístup, i když se zdá, prostředky jsou také zabaleny do stejného balíku aktiv. Zdroj má openRawResource () volání k získání InputStream a openRawResourceFd () volání získat deskriptor souboru, jak je uvedeno výše, ačkoli.

Hodně štěstí.

Odpovězeno 24/09/2010 v 17:30
zdroj uživatelem

hlasů
18

Ujistěte se, že používat Java getExternalStorageDirectory()volání získat skutečnou cestu k sdcard protože novější zařízení nejsou jednoduše namapovat na „/ sdcard“. V takovém případě se snaží používat hardcoded umístění „/ sdcard“ selže.

Odpovězeno 27/01/2011 v 18:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more