java - dll文件的JNI问题

标签 java c++ dll java-native-interface

我再次遇到 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) 中,但我安装了它们,没有任何改变...

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

我会等待帮助)

最佳答案

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

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

这也是 java 很好的主要原因之一,因为它是“平台独立的”(我使用这个术语时不严格,因为其他因素会影响它,使其不真实)。

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

关于java - dll文件的JNI问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19728750/

相关文章:

java - 如何更新 SQL 数据库上的一个对象变量?

c++ - tcp通信的线程

eclipse - 用mingw和eclipse编译dll

c++ - 如何将字符符号作为 Action 数学的字符?

c++ - 加载共享库时出错 : No such file or directory even after using LD_LIBRARY_PATH and changing $PATH

c++ - 在 C++ 中将实用程序 DLL 拆分为更小的组件

Java 复杂排序

java - Wildfly 计时器服务 - 无法创建计时器持久性表

java - @在没有 Controller 的情况下使用 jackson 创建对象时有效

c++ - 使用 C++ boost 库如何创建两个圆并将它们添加到 boost R 树中?