Вы должны упаковать ваши общие библиотеки в ваш apk, чтобы System.loadLibrary("your-lib-name")
смог найти его.Обратите внимание, что System.loadLibrary
будет принимать только имя библиотеки, а НЕ полный путь.
Для System.load()
, я пробовал ниже шаги, это работает хорошо.Вы можете примерить свой проект, чтобы увидеть, как он идет.
Шаг 1:
Убедитесь, что разрешение вашего приложения для внешнего хранилища сконфигурировано в файле manifest.xml, см. Ниже:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Иубедитесь, что вы предоставили эти разрешения.
Шаг 2:
Предположим, загруженный вами файл .so
находится на /Download/
вашей внешней SD-карты, т.е. /Download/libnative-lib.so
.Ниже приведен фрагмент кода, который скопирует libnative-lib.so
в /data/data/<your-app-id>/files/libnative-lib2.so
и загрузка этого libnative-lib2.so
будет выполнена успешно.
String path_sd_card = Environment.getExternalStorageDirectory().getAbsolutePath();
FileOutputStream outputStream;
FileInputStream inputStream;
// 1. This path works.
//System.load("/data/data/com.arophix.jniexample/files/libnative-lib.so");
String filesDir = getFilesDir().getAbsolutePath();
try {
inputStream = new FileInputStream(new File(path_sd_card + "/Download/libnative-lib.so"));
outputStream = new FileOutputStream(new File(filesDir + "/libnative-lib2.so"));//openFileOutput("libnative-lib2.so", Context.MODE_PRIVATE);
FileChannel inChannel = inputStream.getChannel();
FileChannel outChannel = outputStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inputStream.close();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// This path works
System.load(filesDir + "/libnative-lib2.so");
Примечание: проверено на эмуляторе Android Nexus 6P API 23.