我试图使用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结构类?我离答案很近还是很远?
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/的东西 问题答案: 我知道这是一个有点老的话题,但是有相同问题的人很可能会在这里落下来。我想分享一篇博客文章,我