由于Robot.createScreenCaputure()方法很慢,所以我决定使用本机库.我搜索并找到了此 forum https://stackoverflow.com/questions/2912007/java-how-to-toke-take-a-screenshot-fast/4843247#4843247"> code snipplet 使用 jna库.这是一个旧版本,因此我重写了代码: import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferInt; import java.awt.image.DataBufferUShort; import java.awt.image.DirectColorMo
以下是关于 jna 的编程技术问答
osgi找不到我的dll文件,我似乎找不到原因. 目前,我在捆绑包的根上有dll文件(foo.dll),我也尝试在libs目录中使用它. 所讨论的捆绑包的清单看起来像这样: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: foobundle Bundle-SymbolicName: com.foo.bar Bundle-Version: 1.0.0 Bundle-Vendor: me Import-Package: com.sun.jna, com.sun.jna.ptr, com.sun.jna.win32 Export-Package: com.foo.bar Bundle-NativeCode: foo.dll; osname=WindowsXP; processor=x86 然后在我的JNA界面中我执行一个负载(根据文档): public interface MyFooI
可以通过 jna 接口.如何通过GO达到相同的功能? package main import "fmt" import "C" //export Add func Add(x, y int) int { fmt.Printf("Go says: adding %v and %v\n", x, y) return x + y } 解决方案 在审查了有关 GO共享库: 之后. 可以从Java Spring Batch中集成GO函数的调用.以下是一个简短的例子: GO功能: package main import "fmt" import "C" //export Add func Add(x, y int) int { fmt.Printf("Go says: adding %v and %v\n", x, y) return x + y } 之后,执行命令生成二进制文件: go build -buildmod
i可以编译此JNA示例代码(从package com.sun.jna.examples; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; /** Simple example of JNA interface mapping and usage. */ public class HelloWorld { // This is the standard, stable way of mapping, which supports extensive // customization and mapping of Java to native types. public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWind
hi:我想使用JNA在本机库中访问一些功能. 1)如何进行内省本机库文件(例如,文件)以查看可用的方法? 2)在.so文件中可访问的方法与为编译这些文件构建的C代码之间有一对一的映射吗? 3)JNA Gauranteed在所有情况下都可以使用Java/java涉及来自Java的本机库的所有情况(我认为这是JNA的经典用例)吗?或者有时需要JNI吗? 解决方案 1)依赖.EDS.EXE在Windows,objdump,nm等上.在 *nix变体上. 2)大多数共享库都是为C风格链接而设计的.这通常意味着您可以查找与库中符号相对应的地址,但是类型(变量,恒定或功能)和签名信息(用于函数)通常不嵌入库中. . 3)JNA使用了很少的通用JNI操作来执行其所有魔术:打开共享库,查找符号,读取/写内存,调用函数.在很少有情况下,您至少在与c链接处理库时, 在JNA上使用JNI. .
我使用JNA框架的Java应用程序中使用了本机C ++ DLL.我对功能调用有问题.也许我没有正确分配记忆?我没有意见,接下来要做什么.我没有得到更多信息,可以帮助我摆脱文档和论坛线程.我希望你能给我一个提示,会很好. 我想调用本机函数(示例FooInterface).此功能将结构TNativeFoo作为输入和输出参数.结构TNativeFoo包含Double**/Double[][]数据.该字段可以看作是一个多维数组,但是第一个维度仅具有lenght 1.因此,它的指针越多,指向具有大小Items的双阵列. 在结构(char**/String[])中也有一个StringArray,其长度StringsCount,这是无关的,因为它没有使用.我之所以提及它,是因为我不确定该错误是否与此有关.以下是针对本机DLL和结构的定义. public interface Foodll extends StdCallLibrary { Foodll INSTANCE =
在我的应用程序中,我使用JNA使用C中编写的本机代码.在Callback中,我从本机应用程序中获取通知. 在回调中,我得到了一个指针和其他一些数据进行处理.在JNA回调代码中,我必须再次使用此指针来调用其他本机库代码,并必须通过该指针.之后,我必须从这个回调中返回. 如果我不从调用指针中调用该中间本机库方法,该方法可以通过指针,它可以正常工作,但是如果我添加此调用我的应用程序会间歇性崩溃(主要是在处理几百个回调请求后,有时它运行了数以千计的回调也很成功). 此NotificationHook在本机代码中设置挂钩的类对象是静态变量,因为该应用程序只有一个钩子.和本地图书馆一个一个一个. public interface INotificationHook extends Callback { public int NotificationHook(TRANX htrans, NOTIFICATION.ByReference notification); }
对于现有的Java应用程序(我没有源代码),我正在开发一个称为共享库的插件. 不幸的是,此共享库(在C 中编写)不是线程安全的. 该应用程序在几个并发线程中调用我的插件,因此共享库是由这些并发线程调用的,并且自然会由于并发而产生许多错误(例如:已经阻止了打开的文件打开,等等) ) ) ) ) 我正在通过JNA 访问共享库.我什至拥有此共享库的源代码,但是转换为线程安全库将很耗时,目前是不可能的. 还有其他建议克服这个问题的方法吗? 仅从一种Java方法访问所有天然功能,因此我认为制作此方法同步可以是解决方案.你同意吗? 我已经尝试过,但是不幸的是,问题没有解决.在日志文件中,我仍然看到Java方法同时称为Java方法,因此我自己解决此问题的努力失败了. 解决方案 是的,使用同步将是对此的有效解决方案. 如果您这样做并且仍然请参阅并发访问,那么(至少)有两个可能的原因: 您并不总是在同一对象上同步(例如,您的方法是synchronized,但
我正在尝试使用JNA同时操作本机,非线程安全的fortran库.由于库不是线程安全,我尝试实例化同一库的不同副本,但显然它们似乎共享内存地址.如果我在一个库中修改一个变量,则将另一个库中的变量修改为.这种行为使得无法在单独的线程中同意运行它们. 以下代码示例演示了我的意思: code.f: subroutine set(var) implicit none integer var,n common/conc/n n=var end subroutine subroutine get(var) implicit none integer var,n common/conc/n var=n end subroutine 此文件已编译并复制如下: gfortran -shared -O2 code.f -o mylib.so -fPIC cp mylib.so myli
我有以下枚举,我该如何映射JNA ?? 在结构中进一步引用了此枚举. typedef enum { eFtUsbDeviceNotShared, eFtUsbDeviceSharedActive, eFtUsbDeviceSharedNotActive, eFtUsbDeviceSharedNotPlugged, eFtUsbDeviceSharedProblem } eFtUsbDeviceStatus; Abdul Khaliq 解决方案 如果您使用的是JNA,则可能要明确指定Java中的枚举值.默认情况下,Java的基本枚举类型并没有真正为您提供该功能,而必须为枚举添加一个构造函数(请参阅 this 和编码C枚举的一种简单方法是使用与枚举相同名称包裹的公共静态最终const ints.您从Java枚举获得的大多数功能都可以获得分配值的开销. 一些不错的JNA示例,包括下面的摘要(复制)在这里. 假设您的C代码看起来像: enum
与JNI相比, JNA似乎更容易调用本机代码.在什么情况下,您将在JNA上使用JNI? 解决方案 JNA不支持C ++类的映射,因此,如果您使用的是C ++库,则需要JNI包装器 如果您需要大量的内存复制.例如,您调用一种返回大字节缓冲区的方法,然后更改其中的某些方法,然后您需要调用另一个使用此字节缓冲区的方法.这需要您将此缓冲区从C到Java复制,然后将其从Java复制到C.在这种情况下,JNI将赢得性能,因为您可以在C中保留并修改此缓冲区,而无需复制. 这些是我遇到的问题.也许还有更多.但是总的来说,JNA和JNI之间的性能并没有什么不同,因此无论您可以使用JNA,都可以使用它. 编辑 这个答案似乎很受欢迎.所以这里有一些添加: 如果您需要映射C ++或com,则有一个库的库,Jnaerator的创建者Oliver Chafic,称为 动态C/C ++/com Interop:调用C ++方法,创建C ++对象(以及Java的子类C ++类!)
我在网上找到了许多参考文献(包括stackoverflow上的一些参考文献),用于用于C ++库的JNA,但是我在JNA文档中找不到任何东西表明这是可能的.似乎没有任何方法可以包装C ++类. 我需要本机访问使用rtaudio,但是RTAUDIO的所有功能都是RTAUDIO类的成员函数.所以只是为了确认,JNA不是正确的路吗? 解决方案 这个问题等于如何使用JNA 调用C ++实例方法,但您必须做一些工作.特别是,您需要编写一个包装器,该包装器extern "C" s实际上需要调用的任何功能. 对于任何任意type* function()定义,您可以使用JNA映射该方法作为返回com.sun.jna.Pointer,但是您将无法从JNA上调用C ++对象的方法. 这样一个简单的解决方法是编写一个C接口库,该库简单地在对象上调用方法...因此,如果您有某些成员函数foo(),则可以从C ++代码中导出C方法: extern "C" void bar(type
我正在尝试编写一些通过JNA进行等待的代码(例如,调用kernel32函数waitforsingleobject),但是如果thread.inter.inter.inter.inter.inter.inter.inter.inter.inter.int.ient.int.ient.ient.ient.ient.ient.int.int.ient.int.ient.int.ient.int.ient.ient.int.ient.int.ient.ient.ient.ient.ient();我认为Java使用类似事件对象的东西来实现中断.是否有任何方法可以从Java获得该事件以在呼叫中使用WaitgormultipleObjects?或者,如果线程中断,我还有其他方法可以安排我的等待完成? 解决方案 Java通过Nio支持它,很少有人知道,该课程是抽象的,但这不是问题: java.nio.channels.spi.AbstractInterruptibleChannel.它具有
我正在调用Kernel32.Instance.CreateProcess开始一个独立的过程.我面临的一个问题是试图通过环境块到达CreateProcess我每次进行过程都不会启动. 我首先使用 Advapi32Util.getEnvironmentBlock(environment) 创建块,然后制作一个指针(CreateProcess需要(我使用过: ) public static Pointer asPointer(String string) { byte[] data; try { data = Native.toByteArray(string, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } Pointer pointer = new Memory(data.le
我已经在我的Debian 7 (wheezy)中安装了Elasticsearch 6.x.我试图从service elasticsearch start开始,但它给我一个错误消息 root@debian:~# sudo -i service elasticsearch start [FAIL] Starting Elasticsearch Server: failed! 我试图在nano /var/log/elasticsearch/elasticsearch.log上查看Elasticsearch Log Files,然后得到此错误 [2017-12-14T11:25:39,153][WARN ][o.e.b.Natives ] unable to load JNA native support library, native methods will be disabled. java.lang.UnsatisfiedLinkError: Nat
有没有办法让Java中的窗口的X和Y值?我读到我必须使用运行时,因为Java不能直接搞砸,但是我不确定该如何做.谁能指向我的一些链接/技巧? 解决方案 要获得"任何其他无关应用程序"的X和Y位置,您将不得不查询OS,这意味着可能使用JNI,JNA或其他一些脚本效用(例如Windows) ).我建议使用JNA或脚本用途,因为两者都比JNI更容易使用(在我的经验有限的情况下),但是要使用它们,您需要下载一些代码并将其与Java应用程序集成. 编辑1 我不是JNA专家,但是我确实会摆弄一些,这就是我要获得一些名为窗口的窗口坐标: : import java.util.Arrays; import com.sun.jna.*; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.win32.*; public class GetWindowRect { public interface
i knwo已经有一个这样的问题.但是它的解决方案不适合我,因为使用SehellFolder Methode,您只能获得16x16和32x32尺寸的图标. 我提取了一个大小为256x256的HICO,并希望将其转换为Java图像,例如BufferedImage.我找到了它的方法.但是它无法正常工作: public static BufferedImage getIcon(final WinDef.HICON hIcon,int ICON_SIZE,short ICON_DEPTH,int ICON_BYTE_SIZE) { final int width = ICON_SIZE; final int height = ICON_SIZE; final short depth = ICON_DEPTH; final BufferedImage image = new BufferedImage(width, height, BufferedImage.
我们有一个使用GPU(OPENCL)的本机c/asm使用特定方法的大数据进行应用程序,它只是完美的,没问题.项目的一部分(Web和Distribution)是由JEE开发的,我们只需要致电本机应用程序/库. 我们试图使用Process类称其为分离的外部过程.问题在于我们无法控制应用程序(事件,处理程序,线程等).我们还试图将C代码切换为Java代码,但性能死亡.除了运行本机代码作为过程,我正在考虑JNA和JNI,但是有一些问题. 问题: 为了更好(更快)读/写解决方案,是否可以通过直接(未管理)内存[JAVA(ByteBuffer#allocateDirect())]在JNI和JNA中交换数据? 是否可以通过本机代码管理和处理过程,并通过Java代码(OPENCL LIB)访问GPU(共享)内存? 表现呢? JNA比JNI快吗? 我们在Redhat Linux6 x64上有两个AMD W7000聚类设备. 解决方案 JNA比JNI慢得多,但要容易得多.
我试图使用win32 dll的方法,未包含在JNA中. 该方法是 getProductinfo 我在单独的项目中尝试此操作: public interface Kernel32 extends Library { public boolean GetProductInfo(int dwOSMajorVersion,int dwOSMinorVersion, int dwSpMajorVersion, int dwSpMinorVersion, IntByReference pdwReturnedProductType); } 使用.. Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class); IntByReference dwType = new IntByReference(); lib.GetProductI