Tag: java

绑定到特定的IP地址和端口以接收UDP数据

我正在尝试接收由PlayCap( http://www.signal11.us/oss/playcap/ )广播到网络地址192.168.103.255端口3000的UDP数据。 我遇到了绑定到此地址和端口的问题。 这是我的Java代码: public static void main(String[] args) { try { DatagramSocket s = new DatagramSocket(); InetSocketAddress address = new InetSocketAddress(“192.168.103.255”, 3000); s.bind(address); byte buffer[] = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); System.out.println(“Waiting…”); s.receive(packet); System.out.println(“Received!”); } catch (Exception e) { e.printStackTrace(); } } 这会返回错误: java.net.SocketException: already bound at java.net.DatagramSocket.bind(Unknown Source) at […]

在Java应用程序中使用C源代码的最简单方法是什么?

我找到了我想在我的Java应用程序中使用的这个开源库。 该库是用C语言编写的,是在Unix / Linux下开发的,我的应用程序将在Windows上运行。 它是一个主要是数学函数的库,所以据我所知,它不使用任何与平台相关的东西,它只是非常基本的C代码。 而且,它不是那么大,不到5000行。 在我的应用程序中使用库的最简单方法是什么? 我知道有JNI,但这需要找到一个编译器来在Windows下编译库,获得JNI框架的最新版本,编写代码等等。但是可行,但不是那么容易。 有没有更简单的方法? 考虑到库的小尺寸,我很想把它翻译成Java。 是否有任何工具可以帮助解决这个问题? 编辑 我最终将我需要的库部分翻译成Java。 到目前为止,它大约是图书馆的10%,尽管它可能会随着时间的推移而增加。 C和Java非常相似,所以只花了几个小时。 主要的困难是修复因翻译错误而引入的错误。 感谢大家的帮助。 所提出的解决方案似乎都很有趣,当我需要链接到更大的库时,我会研究它们。 对于一小段C代码,手动翻译是最简单的解决方案。

如何配置Native JNI库

如何配置用C编写的Java Native Interface库? 我知道通常的C分析器,但我的问题是如何分析整个集合,包括调用JVM方法,这可能会减慢程序的速度。

使用JNA和Ada的Interface.C包将Ada动态库与Java接口

我必须写一个DLL应该提供一个简单的服务,需要: 在字符串或字节数组中(相当于char *) IN整数表示in char *的大小 IN等效于库中用于写入数据的char *缓冲区 用于写入的可用char *缓冲区的大小 将有效的写入大小输出到out char *缓冲区 使用C视角,签名应如下所示: void myService (char* inBuffer, // as in string int anInteger, // as in param char* outBuffer, // used as out buffer, but initalized by calling code int outBufferSize, // the initaliaed size int usedBufferSize // used as out param, the actually […]

返回并访问jna中结构对象的数组

我有一个结构,在C中包含一些char指针: struct inputsheet { char* TestCaseID[MAX_TEST_CASES]; char* Description[MAX_TEST_CASES]; }; 我有一个返回结构对象数组的函数: struct inputsheet* getapi(char *docname); 现在我想在Java中使用它。 我该如何处理这个结构对象数组? 我能够处理单个对象但不能处理数组。 对于单个对象,我在C中的代码在这里: public class str3 extends com.sun.jna.Structure implements com.sun.jna.Structure.ByReference { public Pointer a1; public Pointer b2; public Pointer c3[]=new Pointer[10]; } 访问它: str2 s2=CLibrary.INSTANCE.parseid(xmlFile1); for(Pointer p1:s2.testCaseID) { if(p1!=null) { System.out.println(p1.getString(0)); } } 编辑 \\c code struct str3{ char *a; […]

解析SWIG接口文件的结构属性

这是我问过的一个问题的延续。 为通过参数返回的函数创建一个typemap 在上一个问题中,接口文件如下: %module test %{ #include “header.h” %} %inline %{ %immutable; struct FieldFetch { int status; int type; char *value; }; %mutable; struct FieldFetch gaiaTextReaderFetchField(gaiaTextReaderPtr reader, int field_num) { struct FieldFetch result; result.status = gaiaTextReaderFetchField(reader, field_num, &result.type, &result.value); return result; } %} %ignore gaiaTextReaderFetchField; %include “header.h” 我现在必须解析位于structs.h中的gaiaTextReaderPtr结构。 这个结构位于以下代码的底部,尽管我已经包含了其中的其他代码以提供完整的图片。 我已经为创建了SWIG opaque数据类型的行加下划线 /** Virtual Text driver: […]

如何在Java中获得新的指针?

如何在JNA中使用C中的方法签名调用方法? int open_device(context *ctx, device **dev, int index); C方法的最后两行如下所示: *dev = pdev; return 0; 这是该方法中dev的唯一用途。 这意味着我必须将一个poiner传递给指向该方法的空指针,对吧? 然后该方法用device对象的地址填充空指针,我可以将指针传递给设备到其他方法。 我的问题是:这是正确的方法吗? 如果是,如何从Java分配新指针? 基于接受的答案,我这样做了: Memory p = new Memory(Pointer.SIZE); Memory p2 = new Memory(Pointer.SIZE); p.setPointer(0, p2); nativeLib.open_device(ctx, p, index); return p2;

你可以在使用JNI从java调用的c ++函数中创建一个新的JVM吗?

所以我的设置是我有一个由我开发的.dll( A.dll ),它在原始应用程序中从外部进程调用,它基本上只是一个.exe文件,我没有源代码( B) .exe )。 A.dll的目的是与.jar文件通信,该文件也是由我开发的( C.jar )。 所以在应用程序中,“通信流程”如下所示 B.exe – > A.dll – > (通过JNI) – > C.jar 现在,我想要做的是在C.jar的开发环境中添加A.dll和C.jar之间的调用作为我的测试套件的一部分。 到目前为止,我已经创建了另一个.dll( D.dll ),它反映了A.dll中的所有函数,但是使用了JNIEXPORT,只是直接调用A.dll中的相应函数。 所以这种情况下的“沟通流程”如下: C.jar开发框架中的unit testing – >(通过JNI) – > D.dll – > A.dll – >(通过JNI) – > C.jar 在这一点上,一个非常简单的函数调用只是在C.jar中打印出来的东西, 它通过整个链条起作用; 从unit testing调用到C.jar 。 但是当我在A.dll中调用函数时会出现问题,该函数使用CreateJavaVM()创建一个新的JVM,这会产生以下错误: 初始化VM时出错无法加载本机库:找不到指定的过程 所以基本上我想知道它是否真的可以这样做,或者只是在同一进程中已经有一个正在运行的JVM时调用CreateJavaVM()根本不可能? 我知道你不能在同一个进程中多次调用CreateJavaVM() ,但是在这种情况下它只被调用一次但是过程中已经存在JVM – 你甚至可以在同一个进程中运行多个JVM吗? 解: 感谢@ apangin的回答,下面的代码片段解决了我的问题: […]

枚举具有N个元素的1d数组的所有k分区?

这似乎是一个简单的请求,但谷歌不是我的朋友,因为“分区”在数据库和文件系统空间中得分很多。 我需要将N个值(N是常数)的数组的所有分区枚举成k个子数组。 子数组就是 – 起始索引和结束索引。 将保留原始数组的整体顺序。 例如,N = 4且k = 2: [ | abcd ] (0, 4) [ a | bcd ] (1, 3) [ ab | cd ] (2, 2) [ abc | d ] (3, 1) [ abcd | ] (4, 0) 并且k = 3: [ | | abcd ] (0, 0, 4) […]

使用stdin和stdout使用Java与外部C程序通信

我要做的是在Java应用程序中启动C程序可执行文件,并允许它们使用stdin和stdout相互通信。 C程序将等待来自Java应用程序的命令并回显它。 我用“gnugo –mode gtp”测试了java代码(gnugo在gtp模式下与stdin和stdout通信)并且它工作正常,但我的C代码不起作用。 任何建议都会非常感激。 C代码 #include #include #include int main(void) { unsigned int byte_read; char *string, *tok; int cmd_id; int len = 64; string = (char *) malloc(len + 1); while (1) { byte_read = getline(&string,&byte_read, stdin); if (byte_read == -1) { printf(“Error reading input\n”); free(string); exit(0); // } else { printf(“Got command: […]