Вы всегда можете получить доступ к каталогу, в котором находится ваше приложение.
Обычно этот каталог:
data/data/<Your_package_name_usually
com.android.appName>/files/<your_filename>
, но лучшеиспользуйте getFilesDir()
, чтобы обеспечить правильный путь к файлу с будущими изменениями версии Android.
Если вы хотите вместо этого использовать внешнее хранилище, убедитесь, что вы поместили эту строку кода в манифест приложения, чтобы получить разрешение.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Затем используйте каталог sdcard:
getExternalStorageDirectory();
//usually : /sdcard/<your_filename>
В противном случае вы можете получить root права на устройство и получить доступ ко всемуфайловая система.Но перед использованием приложения вам нужно будет попросить всех пользователей вашего приложения получить root-доступ на своем устройстве.Некоторые игры используют этот способ, но я бы не стал его рекомендовать.Если вы все еще хотите это сделать, ищите приложение Superuser
для Android, оно бесплатное и надежное.
Когда у вас есть каталог android, просто создайте собственный метод JNI, который получает параметр jstring., и вы устанавливаете его в своем родном коде.Преобразуйте его в std :: string, и вы будете готовы использовать его с fopen ().
//Inside your java activity
File f = this.getApplicationContext().getFilesDir();
LibLoader.setupArchiveDir(f.toString());
//Inside your JNI wrapper
JNIEXPORT bool JNICALL Java_com_android_appName_LibLoader_setupArchiveDir(JNIEnv * env, jobject obj, jstring dir)
{
const char* temp = env->GetStringUTFChars(dir, NULL);
std::string stringDir(temp);
// Will be receive as a std::string inside C++ code
MyNativeObjectInC++->SetupArchiveDir(stringDir);
}
Редактировать:
YouВозможно, потребуется вручную создать файлы / в C, прежде чем использовать его в первый раз:
int result_code = mkdir("/data/data/com.app/files/", 0770)
Cheers!