android - android 上的 libsodium 集成

标签 android android-ndk android-gradle-plugin libsodium

我正在尝试整合 libsodium Android项目上的库。我正在使用带有 gradle (0.9) 和 android 构建工具 (19.1) 的 Android Studio (0.5.8)。 我使用可以在库中找到的脚本编译了 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/ )

我在执行静态调用后在 Activity 中声明了一些 native 函数:

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)

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

谢谢。

最佳答案

现在您的 Java 代码无法知道如何使用您的 native 库。您需要通过使用 Kalium-JNI 或仅实现您需要的部分来完成 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 环境和实现中的对象。

关于android - android 上的 libsodium 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23944727/

相关文章:

java - 未找到 JNI native 方法

android - 改造不适用于应用程序的发布版本

android - 可疑转换为 CLIPBOARD_SERVICE : expected ClipboardManager [ServiceCast] 的文本

Android:管理不同的服务器 URL 以进行开发和发布

android - 使用 Android NDK 通过 openGLES2 渲染视频帧

Android 自定义 ListView 与 ArrayAdapter<String> 可能吗?

使用 LetsEncrypt SSL 证书的站点的 Android 数字 Assets 链接验证失败

android - 由于 INSTALL_FAILED_DEXOPT,部分用户无法安装应用

android - PJSUA2 sip android 原生应用

android - 如何处理 "JNI WARNING : 0x44f81e80 is not a valid JNI reference"