当前位置: 首页 > 知识库问答 >
问题:

是否可以使用JNA/JNI访问本机COM/DirectX API方法?

隗驰
2023-03-14

我试图使用JNA调用这个本机Windows方法:

HRESULT WINAPI DirectSoundCreate(LPGUID LPGUID,lpDirectSound*ppDS,LPUNKNOWN pUnkOuter);

但是我真的很难理解我应该用什么作为Java方面的参数。使用JNA,您应该创建与本机C结构匹配的Java类,我已经成功地使用了WinAPI的其他部分。

据我所知,LPDIRECTSOUND是一个“指向DirectSound结构的长指针”的typedef,LPUNKNOWN是一个“指向未知的长指针”的typedef?

我在dsound.h中找到了本机结构IDirectSound和IUnknown。我该用这些吗?我找不到关于这些结构包含什么的规范,但是,所以当我试图将它们镜像为空的类扩展结构在Java一侧时,我得到

IllegalArgumentException:结构类se.AbjorkLund.Win32.jna.dSound.IDirectSound的大小未知或为零(确保所有字段都是公共的)

所以这显然是行不通的。我想我在这里遗漏了一些基本的东西,也许这与我不理解的COM/Direct API有关,“去读”这样的答案很酷,只要我能得到关于读什么的指示!

下面是我试图使用JNA移植到Java的C程序的一个工作片段。

lpdirectsound directsound;if(directSoundCreate成功(directSoundCreate(0,&DirectSound,0)))

所以在C语言中,只需传递一个指向LPDirectSound的指针。我想我需要做一个LPDIRECTSOUND类来扩展Java的JNA结构类?我离答案很近还是很远?

共有1个答案

郎宏逸
2023-03-14

JNA确实支持COM,并且COM.sun.JNA.platform.win32.COM包中已经存在多个映射,包括IUnknown接口和实现它的相应Unknown类。

您可以实现IDirectSound接口(可选),或者通过扩展unknown直接实现类。您必须使用_invokeNativeObject()(或-int和-void变体)映射所需的函数。

我在wbemcli.java类中提供了查询WMI所需的几个COM类,可以作为如何传递这些参数的示例。(注:我可能不应该在具体的类上使用I接口前缀,但现在已经太晚了。)

函数参数是vtableId、参数的对象数组和返回类型的类。要获得vtableId,必须对头文件中directsoundvtbl结构中的方法(0索引)进行计数。我没有权威的dsound.h文件的副本,但这里有一种排序的可能性(例如,createSoundBuffer的id为3)。从unknown继承已获得Vtbl中的前3个函数(ID为0、1和2)。

这里有一个(完全未经测试的)示例让您开始。

public interface DSound {

    @FieldOrder ({ "dwSize", "dwFlags", ... })
    class DSBUFFERDESC extends Structure {
        public int dwSize;
        public int dwFlags;
        // continue conventional JNA Structure mapping here
        // may have to map nested structures
    }

    class DirectSoundBuffer extends Unknown {
        // methods invoking COM similar to below
    }

    class DirectSound extends Unknown {
        public DirectSound() {
        }

        public DirectSound(Pointer p) {
            super(p);
        }

        public HRESULT CreateSoundBuffer(DSBUFFERDESC lpcDSBufferDesc, DirectSoundBuffer lplpDirectSoundBuffer, Unknown pUnkOuter) {
            // CreateSoundBuffer is 4th method of directSoundVtbl in Dsound.h
            return (HRESULT) _invokeNativeObject(3,
                    new Object[] { getPointer(), lpcDSBufferDesc, lplpDirectSoundBuffer, pUnkOuter }, HRESULT.class);
        }

        // Map whatever functions you need, or all of them!
    }
}
 类似资料:
  • 问题内容: 与JNI相比,JNA似乎更易于调用本机代码。在什么情况下,您将在JNA上使用JNI? 问题答案: JNA不支持c 类的映射,因此,如果您使用的是c 库,则需要一个jni包装器 如果需要大量内存复制。例如,您调用一个返回大字节缓冲区的方法,对其中的内容进行更改,然后需要调用使用此字节缓冲区的另一种方法。这将需要您将该缓冲区从c复制到java,然后再将其从java复制回到c。在这种情况下,

  • 问题内容: 是否有Java库可以访问本机Windows API?使用COM或JNI。 问题答案: 您可以尝试这两个,我都看到了成功。 http://jawinproject.sourceforge.net Java / Win32集成项目(Jawin)是一个免费的开放源代码体系结构,用于Java和通过Microsoft的组件对象模型(COM)或Win32动态链接库(DLL)公开的组件之间的互操作。

  • 问题内容: 是否可以从Java调用COM API(特别是HP / Mercury Quality Center OTA API)?如果是这样,最好的方法是什么? 像JACOB一样合适吗? 代码片段对于基础知识会有所帮助:-) 问题答案: jacob:是的,http://sourceforge.net/projects/jacob- project/ 是一个活跃的项目,可以很好地满足您的目的。 您可

  • 问题内容: 我发现了Java中的方法: 此方法的来源可用吗?也许在OpenJDK中? 问题答案: 来自jdk / src / share / native / java / lang / Object.c 表示其为函数指针(可能已完成,因此他们可以实现特定于平台的本机代码) 为JVM_Clone执行grep会产生以下结果: (从hotspot / src / share / vm / prims

  • 我一直在思考jvm安全的工作方式。原则是,jvm始终信任并运行任何本地代码。因此,从概念上讲,如果您的代码没有显式或隐式调用<code>checkpermission(permission)</code>,这意味着它永远不会失败任何安全验证。当然,所有这些验证调用通常都是在JavaAPI类中完成的,因此我们不需要为内置权限调用它们。 现在,只要您使用内置类(如<code>FileOutputStr

  • 问题内容: 是否有一个(独立的!)Java API,它将XML- RPC接口包装到bugzilla?我不想为此编写自己的api,而且我实际上找不到能够做到这一点(而且只能做到这一点)的库。 更新: 我正在寻找 只用Java编写的类似http://oss.dbc.dk/bugzproxy/的东西 问题答案: 我知道这是一个有点老的话题,但是有相同问题的人很可能会在这里落下来。我想分享一篇博客文章,我