Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 意外的e_机器:Android的KaliumJNI中有3台_Java_Android_Libsodium - Fatal编程技术网

Java 意外的e_机器:Android的KaliumJNI中有3台

Java 意外的e_机器:Android的KaliumJNI中有3台,java,android,libsodium,Java,Android,Libsodium,我试图在Android上使用crypto库(NaCl的可移植版本(NaCl.cr.yp.to)),但我不知道如何正确编译/使用语言绑定 到目前为止,我成功地编译了libnaid网站上描述的libnaid。此外,我使用了3天前添加的新android arm编译脚本。作为测试,我还编译了android-x86版本,以比较生成的库文件的文件大小。它们不同,所以这似乎是可行的。 作为下一步,我使用新生成的android arm libnaude文件安装了KaliumJNI。这里没问题 在我的小andro

我试图在Android上使用crypto库(NaCl的可移植版本(NaCl.cr.yp.to)),但我不知道如何正确编译/使用语言绑定

到目前为止,我成功地编译了libnaid网站上描述的libnaid。此外,我使用了3天前添加的新android arm编译脚本。作为测试,我还编译了android-x86版本,以比较生成的库文件的文件大小。它们不同,所以这似乎是可行的。 作为下一步,我使用新生成的android arm libnaude文件安装了KaliumJNI。这里没问题

在我的小android maven测试应用程序中,它基本上是一个“Hello World”原型,我只是尝试生成一个新的密钥对:

import org.abstractj.kalium.keys.KeyPair;
KeyPair Alice = new KeyPair();
IntelliJ成功地编译了我的小程序,但当我试图在模拟器(或Nexus S)上运行它时,它崩溃了。首先它崩溃了,因为它找不到kaliumjni库,所以我将libtestjni.so(由kaliumjni生成的.so库)添加到我的项目属性中,修复了这个问题。我收到的下一条错误消息告诉我libtestjni.so不是32位的(我运行的是64位的Ubuntu 12.04LTS)。我不明白为什么它必须是32位的,但无论如何,我设法设置了一个32位的Ubuntu 12.04LTS虚拟机,并再次编译了android arm libnaude和KaliumJNI,以生成一个32位的libtestjni.so文件。但是,当我在原始应用程序(在64位计算机上)中使用此32位文件时,我收到以下错误:

java.lang.IllegalStateException: Could not execute method of the activity
    at android.view.View$1.onClick(View.java:3823)
    at android.view.View.performClick(View.java:4438)
    at android.view.View$PerformClick.run(View.java:18422)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at android.view.View$1.onClick(View.java:3818)
    at android.view.View.performClick(View.java:4438)
    at android.view.View$PerformClick.run(View.java:18422)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app-lib/IM.CRYPTO-1/libtestjni.so" has unexpected e_machine: 3
    at java.lang.Runtime.loadLibrary(Runtime.java:364)
    at java.lang.System.loadLibrary(System.java:526)
    at org.abstractj.kalium.NaCl.<clinit>(NaCl.java:36)
    at org.abstractj.kalium.keys.KeyPair.<init>(KeyPair.java:36)
    at IM.CRYPTO.HelloAndroidActivity.buttonClick(HelloAndroidActivity.java:43)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at android.view.View$1.onClick(View.java:3818)
    at android.view.View.performClick(View.java:4438)
    at android.view.View$PerformClick.run(View.java:18422)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)
我很感激任何能给我指明正确方向的提示


请注意,我还有一个小型JAVA桌面应用程序,它使用LibNa+Kalium(不是KaliumJNI),运行时没有任何问题。

正如Alex Cohn所暗示的那样:库(.so文件)是为英特尔x86体系结构编译的,而您尝试运行应用程序的设备(或模拟器)使用其他体系结构(假设为ARM). 因此,您发布的输出中的相关行是:

原因:java.lang.unsatifiedLinkError:dlopen失败:“/data/app lib/IM.CRYPTO-1/libtestjni.so”具有意外的e_计算机:3


你是如何编译这个库的?通常,您下载Android NDK并使用提供的一些Makefile(名为Android.mk)来编译库。不要使用Linux发行版附带的编译器(称为主机编译器)来生成被认为在Android设备上运行的库。

这似乎没有正确包含本机库。不确定从那里走到哪里…请参阅:
e_machine=3
意味着
EM_386
(英特尔80386)。我也遇到了相同的库,尽管使用的是不同的。因此,本机android库。同样的事情,我尝试在我的模拟器上运行它,我得到了完全相同的错误。有人解决了这个问题吗?
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>IM.CRYPTO</groupId>
<artifactId>cryptolibAndroid</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>apk</packaging>
<name>cryptolibAndroid</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <platform.version> 4.0.1.2
        </platform.version>
    <android.plugin.version>3.6.0</android.plugin.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android</artifactId>
        <version>${platform.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.abstractj.kalium</groupId>
        <artifactId>kalium-jni</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

</dependencies>
<build>
    <finalName>${project.artifactId}</finalName>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>${android.plugin.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <undeployBeforeDeploy>true</undeployBeforeDeploy>
                    <attachJar>true</attachJar>
                </configuration>

            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>com.jayway.maven.plugins.android.generation2</groupId>
            <artifactId>android-maven-plugin</artifactId>
            <configuration>
                <sdk>
                    <platform>14</platform>
                </sdk>
            </configuration>
        </plugin>
    </plugins>
</build>
package org.abstractj.kalium;


public class NaCl {

    public static Sodium sodium() {
        return SingletonHolder.SODIUM_INSTANCE;
    }
    
    private static final String LIBRARY_NAME = "sodium";
    
    private static final class SingletonHolder {
        public static final Sodium SODIUM_INSTANCE = new Sodium();
    }
    
    private NaCl() {
    }

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