我再次遇到 JNI 问题...
这次我的代码可以工作...但是...并非在所有 PC 上都是正确的。
我有:
- Jar 文件 -> 我的程序
- dll 文件 -> 使用本地方法
- 另一个 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/