Reputation: 302
In my app I have to pass a file from assets folder to shared library. I cannot do it with use of jni right now. I'm using precompiled shared library in my project, in which I have hardcoded path to my file, but I'm getting error "No such file or directory". So in my .apk file I have .so file in libs/armeabi-v7a folder and my file in /assets folder.
I have tried to do it like this:
char *cert_file = "/assets/cacert.cert";
av_strdup(cert_file);
And some other paths, but it doesn't work.
Is it possible at all?
Upvotes: 12
Views: 11865
Reputation: 31
Building off of the answer by @Sistr , I used getBuffer
along with AASSET_MODE_BUFFER
(instead of AAsset_read
).
However, I was trying to write the buffer to an ofstream
. I got signal crashes using the <<operator
:
ofstream myStream(<some file>, ios_base::binary);
auto buffer = AAsset_getBuffer(asset);
myStream << buffer;
I presume this is because the buffer pointer points to the asset without a NULL
character at the end (I was reading a text asset; Android source code). Using the write
function worked:
ofstream myStream(<some file>, ios_base::binary);
auto buffer = AAsset_getBuffer(asset);
myStream.write((char *)buffer, AAsset_getLength(asset));
This is because the <<operator
does not have to call strlen
to find out how many characters to write since it is explicitly given by AAsset_getLength
.
Upvotes: 0
Reputation: 1205
You can simply use the AAssetManager class in C++.
Basically you need to:
AAssetManager* assetManager
Use it to read your file:
// Open your file
AAsset* file = AAssetManager_open(assetManager, filePath, AASSET_MODE_BUFFER);
// Get the file length
size_t fileLength = AAsset_getLength(file);
// Allocate memory to read your file
char* fileContent = new char[fileLength+1];
// Read your file
AAsset_read(file, fileContent, fileLength);
// For safety you can add a 0 terminating character at the end of your file ...
fileContent[fileLength] = '\0';
// Do whatever you want with the content of the file
// Free the memoery you allocated earlier
delete [] fileContent;
You can find the official ndk documentation here.
Edit: To get the AAssetManager object:
- In a native activity, you main function as a paramater android_app* app, you just need to get it here: app->activity->assetManager
- If you have a Java activity, you need so send throught JNI an instance of the java object AssetManager and then use the function AAssetManager_fromJava()
Upvotes: 22
Reputation: 288
Your assets are packaged into your apk, so you can't refer to them directly during runtime like in the sample code you provided. You have 2 options here:
Context.getAssets().open('cacert.cert')
Upvotes: 3