NDK загрузить активы - PullRequest
       3

NDK загрузить активы

2 голосов
/ 28 ноября 2011

Я использую этот метод для загрузки активов в NDK:

jclass localRefCls = myEnv->FindClass("(...)/AssetLoaderHelper");
helperClass = reinterpret_cast<jclass>(myEnv->NewGlobalRef(localRefCls));
myEnv->DeleteLocalRef(localRefCls);

helperMethod1ID = myEnv->GetStaticMethodID(helperClass, "getFileData", "(Ljava/lang/String;)[B");

...

myEnv->PushLocalFrame(10);

jstring pathString = myEnv->NewStringUTF(path);
jbyteArray data = (jbyteArray) myEnv->CallStaticObjectMethod(helperClass, helperMethod1ID, pathString);

char* buffer = new char[len];
myEnv->GetByteArrayRegion(data, 0, len, (jbyte*)buffer);

myEnv->DeleteLocalRef(pathString);
myEnv->DeleteLocalRef(data);

jobject result;
myEnv->PopLocalFrame(result);
myEnv->DeleteLocalRef(result);

return buffer;

в Java:

public static byte[] getFileData(String path)
{
InputStream asset = getAsset(path); //my method using InputStream.open

byte[] b = null;
try
{
    int size = asset.available();
    b = new byte[size];
    asset.read(b, 0, size);
    asset.close();
}
catch (IOException e1)
{
    Log.e("getFileData", e1.getMessage());
}

return b;
}

Это работает, но когда я загружаю много ресурсов, происходит сбой или системные блокировки. Я делаю какую-либо ошибку, или кто-то знает лучший способ загрузить активы в NDK? Возможно, это только проблема с нехваткой памяти в моем устройстве?

1 Ответ

0 голосов
/ 20 декабря 2011

Я не уверен в вашей конкретной проблеме, но я могу предложить альтернативное решение для открытия ресурсов JNI:

  1. На стороне Java создайте AssetFileDescriptor для каждого рассматриваемого файла (вызовите этот fd длятеперь
  2. Передайте значение fd.getFileDescriptor (), fd.getStartOffset () и fd.getLength () в функцию JNI
  3. На стороне JNI теперь можно использовать fdopen (),fseek (), fread () и т. д., используя информацию из # 2
  4. Не забудьте вызвать fd.close () после работы с JNI

Надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...