1

我又遇到了 JNI 的问题...

这次我的代码有效......但是......在所有PC上都不正确。

我有:

  1. Jar 文件 -> 我的编
  2. dll 文件 -> 使用本机方法
  3. 另一个dll文件->具有其他功能。

在我的电脑上,所有这些文件都在一个文件夹中。

文件代码(.java):

// loading library
    try {
        Runtime.getRuntime().loadLibrary("E140tests");
        setText("Library E140tests.dll was loaded correctly.");
    } catch (UnsatisfiedLinkError ex) {
        // try load with absolute path
        setText("Error: E140tests.dll wasn't loaded!");
        setErrorFlag(true);
    }

E140tests.dll -> 第二个文件(在 MSVS 中编译)

#include "jni.h"
#include "jni_md.h"
#include "Lusbapi.h"
#include "LusbapiTypes.h"
#include "JNITEST2.h"

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     JNITEST2
 * Method:    ADCinit
 * Signature: (LJNITEST2;)V
 */
JNIEXPORT void JNICALL Java_JNITEST2_ADCinit
  (JNIEnv* env, jobject, jobject obj) {
  ...

lusbapi.dll -> 第三个文件,具有其他功能。

#ifndef __LusbapiH__
#define __LusbapiH__

// --------------------------------------------------------------------------
// ---------------------------- COMMON PART ---------------------------------
// --------------------------------------------------------------------------
#include <windows.h>
#include "LusbapiTypes.h"

如果我将文件扔到 system32 中,那么一切正常。

但。在另一台 PC(xp,7)中,我的代码不起作用!没关系:如果文件(+dll)在一个文件夹中,或者 dll 文件在 system32 -> 代码中找不到它们。

我想,这个问题出在运行时库(MSVS)中,但是我安装了它们,没有任何改变......

(在我的 PC 上是 IntelijIDEA、MSVS、jdk7.xx -> 一切正常。我在另一台 PC 上测试了 prog(安装了 MSVS)-> 一切正常。但在另一台 PC 上 -> 找不到 dll(并安装了运行时库也))。

我会等待帮助)

4

3 回答 3

2

不幸的是,当您编译 .DLL 时,它只与匹配体系结构的系统兼容。

又名:32 位 .DLL 在 32 位机器上的工作,同样适用于 64 位。有一些策略可以解决这个问题(购买 Visual Studio 的许可证会为您提供允许这样做的工具,并将生成特定于平台的 .dll),但这意味着您必须将适当的 .DLL 与您所使用的任何版本的程序捆绑在一起'正在测试。这就是为什么网站上大部分时间都会询问您是 32 位还是 64 位机器。

这也是 java 很好的主要原因之一,因为它是“平台无关的”(我使用这个术语很松散,因为其他事情会影响它使其不真实)。

无论哪种方式,只要添加 JNI 调用,就会添加大量依赖项,这会使分发软件变得更加困难。

于 2013-11-01T14:54:26.117 回答
0

您必须在两种体系结构中编译 DLL。对于编译,您可以使用您的 64 位系统并使用这些命令进行编译。

对于 64 位 (GCC)

gcc -o E140Tests64.dll -shared -IC:\....\include sourcefile.c

对于 32 位 (GCC)

gcc -o E140Tests.dll -shared -IC:\....\include sourcefile.c

希望这可以帮助。

于 2013-11-01T15:03:19.293 回答
0

如果您要分发您的应用程序,您将需要构建 32 位和 64 位版本的 DLL。然后使用以下技术来加载正确的 DLL,而不管您的客户 JVM 架构如何。将 32 或 64(MyJniDLL32.dll 和 MyJniDLL64.dll)附加到生成的输出文件中。

String archDataModel = System.getProperty("sun.arch.data.model");
System.loadLibrary(libraryName+archDataModel);

DLL 的拱门(32 对 64)必须与 JVM ach(32 对 64)匹配,而不是操作系统拱门。如果您在 64 位操作系统上运行 32 位 JVM,则您的 Java 代码必须能够访问 32 位 DLL。

于 2013-11-07T14:29:52.380 回答