Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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 dll文件的JNI问题_Java_C++_Dll_Java Native Interface - Fatal编程技术网

Java dll文件的JNI问题

Java dll文件的JNI问题,java,c++,dll,java-native-interface,Java,C++,Dll,Java Native Interface,我和JNI有问题,再一次 这一次我的代码有效。。。但是在所有电脑上都不正确 我有: Jar文件->我的程序 dll文件->使用本机方法 另一个dll文件->具有另一个函数 在我的电脑上,所有这些文件都在一个文件夹中 文件代码(.java): E140tests.dll->第二个文件(在MSVS中编译) lusbapi.dll->第三个文件,带有其他函数 #ifndef __LusbapiH__ #define __LusbapiH__ // --------------------------

我和JNI有问题,再一次

这一次我的代码有效。。。但是在所有电脑上都不正确

我有:

  • Jar文件->我的程序
  • dll文件->使用本机方法
  • 另一个dll文件->具有另一个函数
  • 在我的电脑上,所有这些文件都在一个文件夹中

    文件代码(.java):

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

    lusbapi.dll->第三个文件,带有其他函数

    #ifndef __LusbapiH__
    #define __LusbapiH__
    
    // --------------------------------------------------------------------------
    // ---------------------------- COMMON PART ---------------------------------
    // --------------------------------------------------------------------------
    #include <windows.h>
    #include "LusbapiTypes.h"
    
    \ifndef\uu lusbaih__
    #定义u_lusbaih__
    // --------------------------------------------------------------------------
    //------------------------------公共部分---------------------------------
    // --------------------------------------------------------------------------
    #包括
    #包括“LusbapiTypes.h”
    
    如果我把我的文件放进system32,一切都会正常

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

    我想,问题出在运行库(MSV)中,但我安装了它们,没有任何改变

    (在我的电脑上有IntelijIDEA、MSV、jdk7.xx->all works。我在另一台电脑上测试了prog(安装了MSV)->并且都正常工作。但是在另一台电脑上找不到->dll(也安装了运行库))


    (我将等待帮助)

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

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

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


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

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

    用于64位(GCC)

    对于32位(GCC)


    希望这对您有所帮助。

    如果您要分发应用程序,您需要同时构建32位和64位版本的DLL。然后使用以下技术加载正确的DLL,而不考虑您的客户。将32或64(myjnidl32.dll&myjnidl64.dll)追加到生成的输出文件中

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

    DLL的arch(32对64)必须与JVM ach(32对64)匹配,而不是与OS arch匹配。如果您在64位操作系统上运行32位JVM,您的Java代码必须具有32位DLL的访问权限。

    您是否尝试使用?
    错误检查依赖项:未找到至少一个必需的隐式或转发依赖项。错误:找到了具有不同CPU类型的模块。
    计算机上的WAR不工作…不工作的系统架构和用于编译的系统架构是什么?me系统是x32(x86)和errorSys->x64。这可能解释了出现错误的原因。我不确定。我的朋友有x64系统,所有的工作都正常!。。但是在另一台PC上(使用x64)->没有,如果是这样,那么很可能是侥幸,它碰巧在他的电脑上工作,而不是在另一台电脑上。一般来说,.DLL肯定是特定于平台的,除非我知道这两个系统的确切规格,否则很难确定这两个平台之间的确切区别,即使那样,.DLL的内容也会有所不同。@AndrewEvt如果它在你朋友的64位机上工作,他应该安装32位Java。这个^。我花了点钱,他是在32位JVM上编译的。很好的电话。
    #ifndef __LusbapiH__
    #define __LusbapiH__
    
    // --------------------------------------------------------------------------
    // ---------------------------- COMMON PART ---------------------------------
    // --------------------------------------------------------------------------
    #include <windows.h>
    #include "LusbapiTypes.h"
    
    gcc -o E140Tests64.dll -shared -IC:\....\include sourcefile.c
    
    gcc -o E140Tests.dll -shared -IC:\....\include sourcefile.c
    
    String archDataModel = System.getProperty("sun.arch.data.model");
    System.loadLibrary(libraryName+archDataModel);