Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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
通过JNA调用一个非常复杂的C++ Win32 DLL的方法,通过java进程处理具有多个类的类 我有一个非常复杂的大的DLL,它是由其他部门的开发人员用C++编写的,它需要被我的java进程使用。我所拥有的:_Java_C++_Dll_Jna - Fatal编程技术网

通过JNA调用一个非常复杂的C++ Win32 DLL的方法,通过java进程处理具有多个类的类 我有一个非常复杂的大的DLL,它是由其他部门的开发人员用C++编写的,它需要被我的java进程使用。我所拥有的:

通过JNA调用一个非常复杂的C++ Win32 DLL的方法,通过java进程处理具有多个类的类 我有一个非常复杂的大的DLL,它是由其他部门的开发人员用C++编写的,它需要被我的java进程使用。我所拥有的:,java,c++,dll,jna,Java,C++,Dll,Jna,限制:尽管我有一个.sol文件,但不允许我对该DLL进行任何更改 目标:我希望我的java进程能够从这个DLL调用一些方法 仪器:首先我想用JNA试试,然后用JNI试试 问题: 我阅读了一些关于JNA的一般信息,了解到,首先要构建要在接口中调用的方法的原型。好的,现在的问题是:我想调用的方法将DLL项目中的自定义对象作为参数。例如,我在DLL中有一个函数,如: __declspec(dllexport) BOOL WINAPI NiceFunction( Dummy_Sta

限制:尽管我有一个.sol文件,但不允许我对该DLL进行任何更改

目标:我希望我的java进程能够从这个DLL调用一些方法

仪器:首先我想用JNA试试,然后用JNI试试

问题:

我阅读了一些关于JNA的一般信息,了解到,首先要构建要在接口中调用的方法的原型。好的,现在的问题是:我想调用的方法将DLL项目中的自定义对象作为参数。例如,我在DLL中有一个函数,如:

__declspec(dllexport) BOOL WINAPI NiceFunction( 
          Dummy_State *ModuleState, Dummy_Handle Handle, Dummy_Exception &Exception,
          LPCTSTR name, DWORD timer);
其中,所有虚拟对象都是在此DLL中定义的类

问题1:如何在java进程中使用JNA调用这样的函数

问题2:在我的java过程中是否可以直接使用这些对象?也许要导入构造函数?然而,这些对象的构造函数经常需要调用父类的构造函数


问题3:最后但并非最不重要的一点是,我的DLL还调用了两个附加DLL,并广泛使用它们中的一些虚拟对象的数据。我是否还需要通过JNA在java进程中导入它们 您必须将它们映射到Java接口。例如:

public interface ComplicatedAndBigLibrary {
    // Create an instance to access the mapped functions with
    // the String in quotes is the filename, minus .dll
    ComplicatedAndBigLibrary INSTANCE = 
        (ComplicatedAndBigLibrary) Native.load("compbiglib", W32APIOptions.DEFAULT_OPTIONS);

    // Map the C structures or typedefs
    // Use "extends" as needed for parents
    @FieldOrder({"field1", "field2"})
    class Dummy_State extends Structure {
        // map structure fields here
        public int field1;
        public byte field2;
    }

    class Dummy_Handle extends WinNT.HANDLE {
        // any overrides you need
    }

    // Map your functions (that were externalized)
    boolean NiceFunction( 
          Dummy_State ModuleState, Dummy_Handle Handle, Dummy_Exception ExceptionPointer,
          LPCTSTR name, DWORD timer);
}
看一看JNA,了解许多基于Windows DLL的示例类型。实际上,您正在对DLL执行相同的操作

在我的java过程中直接使用这些对象

也被称为两个附加DLL,并广泛使用来自它们的数据


您需要映射其他DLL,类似地创建一个接口,使用Native.load和映射函数/常量等。

Dummy\u Exception&Exception-这是extern C函数中的一个参数?引用不应用作此类函数的参数类型。您基本上与构建DLL的编译器、编译器版本、编译器选项等绑定在一起。@PaulMcKenzie,哦,您是对的,我刚刚从google自动复制了这个示例,没有注意到。当然,实际上没有必要使用extern C。非常感谢,这是一个非常有用的答案!还有两个问题,如果你有时间回答,我会非常感激:问题4:如果我理解正确,你可以做以下事情:编写一个函数,它将完成.dll库的.cpp文件中的所有内容,用extern C包装它,并通过JNA调用?我知道这是一个坏习惯,虽然。。。问题5:为了包装整个类,我只需向.dll的.cpp文件添加一个工厂函数,还是需要使用wrapper.h中的struct完全重新创建我的类,用ptr更改所有引用?还有一个更一般的问题6:如果要映射某个类,哪个类继承了其他一些类,2有一个继承类的类型字段,或者继承类的父类的类型字段,那么如何用C中的struct包装这些内容呢?你有没有关于这方面的假例子?就我理解的意思来说,你并不是在C中编写代码,实际上你把C++代码的一部分写在C.上,在DLL中重写所有50个类,这是非常痛苦的,因为它有复杂的继承方案,简单的C-StultQ4:是的,你可以编写一个C函数,调用C++中调用的任何东西,然后编译DLL。然后,您可以从JNA引用您的C DLL。注意,您可以使用JNI访问C++代码,但从性能标准来看,这可能是比较好的。Q5:您只需要将java中需要访问的函数封装为方法。该结构只是内存布局的定义,您可以在JNA中编写它们,而不需要任何类型的映射,您只需传递指针。例如,假设C++中有结构FoO,并且你有一个C++方法BARFO,它内部调用另一个函数BAZ,但你不必自己调用BAZ。您可以直接在Java中映射foo,但必须为bar编写一个extern C包装器。您不需要包装baz.Q6:您不需要担心结构。您可以在Java中映射它们,您只需定义内存布局。通常需要包装的唯一内容是希望作为方法访问的函数。您可能会考虑使用这些自动化来为您服务。
ComplicatedAndBigLibrary CABL = ComplicatedAndBigLibrary.INSTANCE;
CABL.NiceFunction(foo, bar, ...)