Интеграция libsodium на андроид

Я пытаюсь интегрировать библиотеку libsodium в проект Android. Я использую Android Studio (0.5.8) с Gradle (0.9) и инструментами сборки Android (19.1). Я скомпилировал libsodium со скриптами, которые можно найти в библиотеке. Я получаю четыре библиотеки preBuild (.so файлы) для разных архитектур (arm, arm-v7a, mips & x86). Я поместил эти файлы в папку jniLibs. В своем файле build.gradle я заявляю, что использую NDK, и настраиваю путь к файлу local.properties.

В этой версии gradle нет необходимости писать make-файл ( http://ph0b.com/android-studio-gradle-and-ndk-integration/)

Я объявляю некоторые нативные функции в моей деятельности после статического вызова:

static {
    System.loadLibrary("sodium");
}

public final static native String sodium_version_string();

onCreate() {
    ...
    Log.d(getClass().getName(), "Sodium version:" + sodium_version_string());
}

Выход Logcat:

05-29 23:14:10.538     481-1569/system_process I/ActivityManager﹕ Start proc com.example.myapplication2.app.x86 for activity com.example.myapplication2.app.x86/com.example.myapplication2.app.MainActivity: pid=1584 uid=10056 gids={50056, 1028}
05-29 23:14:10.554    1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ Trying to load lib /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520
05-29 23:14:10.562    1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ Added shared lib /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520
05-29 23:14:10.562    1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ No JNI_OnLoad found in /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520, skipping init
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 W/dalvikvm﹕ No implementation found for native Lcom/example/myapplication2/app/MainActivity;.sodium_version_string:()Ljava/lang/String;
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 D/AndroidRuntime﹕ Shutting down VM
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4c46648)
05-29 23:14:10.578    1584-1584/com.example.myapplication2.app.x86 E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: Native method not found: com.example.myapplication2.app.MainActivity.sodium_version_string:()Ljava/lang/String;
        at com.example.myapplication2.app.MainActivity.sodium_version_string(Native Method)
        at com.example.myapplication2.app.MainActivity.onCreate(MainActivity.java:28)

Мне не хватает, чтобы объявить что-то в другом файле? Неужели нужен калий-JNI? Как эта библиотека может быть включена в проект?

Благодарю.

1 ответ

Прямо сейчас ваш Java-код не может знать, как использовать вашу нативную библиотеку. Вам нужно выполнить часть JNI, используя Kalium-JNI или реализуя только те части, которые вам нужны.

В случае sodium_version_string(), это должно работать:

jstring java_com_example_myapplication2_app_MainActivity_sodium_version_string(JNIEnv* env, jclass cls)
{
    return (env*)->NewStringUTF(env, sodium_version_string());
}

Вот java_com_example_myapplication2_app_MainActivity_sodium_version_string реализация будет автоматически связана с вашим static native String sodium_version_string() благодаря конвенции JNI.

Ты можешь использовать JNI_Onload() вместо этого, чтобы вручную объявить такую ​​связь, но вам все равно нужно иметь дело со средой JNI и объектами внутри реализаций.

Другие вопросы по тегам