如何将文件添加到Android项目中,然后使用NDK加载它



我使用的是最新版本的Android Studio(2.2.3),我已经加载了HelloGL2示例项目。

我现在想在我的应用程序中添加一个文件(任何类型的文件),然后能够打开它,并使用c的fopen等在c++代码中读取它(任何直接文件访问api都可以)

我该怎么做?

有两个选项,这取决于您的目标。如果你的文件是一个基本的文本配置文件,你可以使用这两种情况,但如果你的是一个三维对象,如(.obj,.max,.dae),你应该使用AssetManager类。

第一个选项:(将文件存储在res raw中(可以使用fopen())

  • 在res目录(res->raw)中创建一个名为raw的文件夹
  • 将文件写入apk私有目录

在Java中:

public void writeFileToPrivateStorage(int fromFile, String toFile) 
{
InputStream is =   mContext.getResources().openRawResource(fromFile);
int bytes_read;
byte[] buffer = new byte[4096];  
try 
{
FileOutputStream fos = mContext.openFileOutput(toFile, Context.MODE_PRIVATE);
while ((bytes_read = is.read(buffer)) != -1)            
fos.write(buffer, 0, bytes_read); // write
fos.close();
is.close();
} 
catch (FileNotFoundException e) 
{            
e.printStackTrace();
} 
catch (IOException e) 
{            
e.printStackTrace();
}                 
}  

然后,调用您的函数:

writeFileToPrivateStorage(R.raw.your_file,"your_output_file.txt");
  • 获取您的私人路径
path=mContext.getApplicationContext().getFilesDir().toString()
  • 用Java定义您的JNI函数:
public static native void setconfiguration(String yourpath)
  • 在C/C++中实现:
JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_setconfiguration(JNIEnv*env,jobject obj,jstring path){//将字符串转换为std::string。const char*nativeString=env->GetStringUTFChars(config_path,0);//让这里成为你的宝贝。fopen(nativeString,"r");}

第二个选项(使用assetManager,通常用于opengl资源)

在这种情况下,参数不是目录的路径,而是资产管理器。

  • 将文件存储在资产目录中
  • 在C/C中定义您的本机函数++
public static native void yourfunction(AssetManager AssetManager)
  • 用java调用此函数:
loadYourFile(m_context.getAssets())
  • 在C/C中创建jni函数++
JNIEXPORT void Java_com_android_gl2jni_GL2JNILib_(JNIEnv*env,jobject obj,jobject Java_asset_manager){AAssetManager*mgr=来自java的AAssetMManager_fromJava(env,java_asset_manager);AAsset*asset=AAssetManager_open(mgr,(const-char*)js,AAsset_MODE_UNKNOWN);if(NULL==资产){__android_log_print(android_log_ERROR,NF_log_TAG,"_ASSET_NOT_FOUND_");返回JNI_FALSE;}long-size=AAsset_getLength(资产);char*buffer=(char*)malloc(sizeof(char)*size);AAsset_read(资产、缓冲区、大小);__android_log_print(android_log_ERROR,NF_log_TAG,缓冲区);AAsset_close(资产);}

注意:不要忘记在AndroidManifest.xml中添加权限。

注意二:不要忘记添加:

#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>

我希望这个答案对你有帮助。

相关内容

最新更新