NDK加载资产

时间:2011-11-28 10:21:16

标签: android android-ndk

我正在使用此方法在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 :(得分:-1)

我不确定您的确切问题,但我可能会提供另一种解决方案来打开资产JNI方面:

  1. Java端为每个有问题的文件创建一个AssetFileDescriptor(暂时调用此fd
  2. 将fd.getFileDescriptor(),fd.getStartOffset()和fd.getLength()的值传递给JNI函数
  3. JNI方面你现在可以使用来自#2
  4. 的信息使用fdopen(),fseek(),fread()等
  5. 不要忘记在JNI工作后调用fd.close()
  6. 希望有所帮助