首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libsodium在android上的集成

libsodium在android上的集成
EN

Stack Overflow用户
提问于 2014-05-30 07:34:31
回答 1查看 2.3K关注 0票数 10

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

在这个版本的gradle中,不需要编写makefile (http://ph0b.com/android-studio-gradle-and-ndk-integration/)

在执行静态调用后,我在活动中声明了一些本机函数:

代码语言:javascript
复制
static {
    System.loadLibrary("sodium");
}

public final static native String sodium_version_string();

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

Logcat输出为:

代码语言:javascript
复制
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真的有必要吗?如何将这个库包含在项目中?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-06-02 18:00:34

现在,您的Java代码无法知道如何使用本地库。您需要完成JNI部分,要么使用Kalium-JNI,要么只实现您需要的部分。

sodium_version_string()的情况下,这应该是可行的:

代码语言:javascript
复制
jstring java_com_example_myapplication2_app_MainActivity_sodium_version_string(JNIEnv* env, jclass cls)
{
    return (env*)->NewStringUTF(env, sodium_version_string());
}

在这里,由于JNI约定,java_com_example_myapplication2_app_MainActivity_sodium_version_string实现将自动关联到您的static native String sodium_version_string()

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23944727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档