2012-05-02 11 views
10

Potrzebuję odczytać plik tekstowy z folderu zasobów w Androidzie, przeszukując internet Znalazłem api asset_manager dostępne od wersji Android 2.3. Ponieważ kierujemy reklamy tylko na tablety, jest to przydatne. Ale ponieważ nie jestem ekspertem w języku C, nie jestem w stanie znaleźć żadnego przykładu, jak czytać/zapisywać pliki za pomocą deskryptora pliku. Znalazłem wiele przykładów przy użyciu pliku * (wskaźniki pliku)Android odczyta plik tekstowy z folderu zasobów za pomocą C (ndk)

Moim celem jest, aby odszyfrować plik js z folderu aktywów, który jest zaszyfrowany używając C (do zabezpieczania kodu), a kod js jest widoczny jeżeli użytkownik końcowy dekompilowałam mój apk. Ponieważ folder zasobów znajduje się wewnątrz pliku zip, można to zrobić?

Odpowiedz

31

Oto kod Czytałem plik z Android aktywów folderu za pomocą asset_manager NDK lib

AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); 
    AAsset* asset = AAssetManager_open(mgr, (const char *) js, AASSET_MODE_UNKNOWN); 
    if (NULL == asset) { 
     __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, "_ASSET_NOT_FOUND_"); 
     return JNI_FALSE; 
    } 
    long size = AAsset_getLength(asset); 
    char* buffer = (char*) malloc (sizeof(char)*size); 
    AAsset_read (asset,buffer,size); 
    __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, buffer); 
    AAsset_close(asset); 

Dodano następującą linię do mojego Android.mk

# for native asset manager 
LOCAL_LDLIBS += -landroid 

I nie zapomnij include w pliku źródłowym

#include <android/asset_manager.h> 
+1

Świetna odpowiedź! Działa dla mnie w połączeniu z Assimpem do ładowania modeli 3D.Najpierw ładuję plik do pamięci, jak opisano powyżej, a następnie przekazuję bufor do aiImportFileFromMemory – j00hi

+0

. Czy możesz mi pomóc dowiedzieć się, gdzie przekazałeś nazwę pliku? – Nishant

+0

@Nishant Czy możesz dowiedzieć się, jak przekazać nazwę pliku? – re3el

2

Praktycznie FILE * i deskryptory „INT” są równoważne i fread/fwrite/fopen/fclose są odpowiednikami funkcji otwierania/zamykania/odczytu/zapisu (funkcje są nie równoważne jednak te ostatnie są dla -bloking).

Aby dostać się 'INT' z 'FILE *' można użyć

int fileno(FILE* f); 

w nagłówku i zrobić odwrotność można użyć fdopen()

FILE *fdopen(int fd, const char *mode); 

Więc albo zastąpić wszystko za pomocą PLIK * do int lub po prostu weź jedną z próbek i wstaw ten kod konwersji przed odczytaniem pliku.

+0

Dzięki, pozwól mi spróbować, że –

+1

OK. To nie ma nic wspólnego z NDK, więc jeśli napiszesz tutaj kod C, z którym masz problemy, społeczność będzie w stanie ci pomóc. Powodzenia w kodowaniu :) –

2

Jest bardzo podobny do zwykłych funkcji fread/fseek. Tu przeczytał funkcja declaraton:

ssize_t read(int fd, void *buf, size_t count); 

Odczytuje z fd pliku deskryptora w buf bufor count bajtów. Jeśli myślisz o fread, wtedy zamiast:

fread(buf, count, size, file); 

można nazwać:

read(fd, buf, count*size); 

I to wszystko. To takie proste.

Poszukiwanie jest również podobne. Po prostu wyszukaj deklarację funkcji i przeczytaj nazwy/opisy argumentów. To będzie oczywiste.

Powiązane problemy