android上的libsodium集成

Alb*_*ert 8 android android-ndk android-gradle-plugin libsodium

我正在尝试将libsodium库集成到Android项目中.我正在使用带有gradle(0.9)和android构建工具(19.1)的Android Studio(0.5.8).我用libsodium编译了libsodium,这些脚本可以在库中找到.我为不同的架构(arm,arm-v7a,mips和x86)获得了四个preBuild库(.so文件).我把这些文件放在jniLibs文件夹中.我在build.gradle文件中声明我正在使用NDK并在local.properties文件上配置路径.

在这个版本的gradle中,没有必要编写一个makefile(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());
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我是否缺少在另一个文件中声明某些内容?是否真的需要kalium-JNI?如何将这个lib包含在项目中?

谢谢.

ph0*_*h0b 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());
}
Run Code Online (Sandbox Code Playgroud)

这里的java_com_example_myapplication2_app_MainActivity_sodium_version_string实现会自动关联到你static native String sodium_version_string()感谢的JNI约定。

您可以使用JNI_Onload()手动声明此类关联,但您仍然需要处理实现中的 JNI 环境和对象。