使用JNA可以简单实现java调用C程序,以及C程序回调java程序。
编写一个C程序
#include "stdio.h" #include "string.h" #include "sys/socket.h" #include <arpa/inet.h> #include <pthread.h> #include <unistd.h> static int (*AddByCallback)(void *arg)=NULL; /*注册回调*/ void RegisterAdd(int (*callback)(char*)){ AddByCallback = callback; pthread_t ntid; int err = pthread_create(&ntid,NULL,udpServer,NULL); printf("this is C program: can't create thread\n"); } void *udpServer(void *arg){ int socket_desc; struct sockaddr_in server_addr,client_addr; char server_message[100],client_message[100]; memset(server_message,0,sizeof(server_message)); memset(client_message,0,sizeof(client_message)); socket_desc = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(socket_desc < 0){ printf("Error while createing socket\n"); return -1; } server_addr.sin_family = AF_INET; server_addr.sin_port =htons(2000); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if(bind(socket_desc,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0){ printf("Couldn't bind to the port\n"); return -1; } printf("Done with binding\n"); while(1){ if(recvfrom(socket_desc,client_message,sizeof(client_message),0,(struct sockaddr*)&client_addr,&client_struct_length) < 0){ printf("Couldn't receive\n"); return -1; } printf("Msg from client: %s\n",client_message); /*接收消息回调到java进行业务处理*/ int ret = AddByCallback(client_message); printf("this is C Program ret = [ %d ]\n",ret); } close(socket_desc); return 0; }
把C程序编译成so
gcc -fpic -c MySo.c
gcc -shared -o libMySo.so MySo.o
把编译的so放到/home/lib下
编写Java程序
public interface MySo extends Library{
MySo myso = (MySo)Native.loadLibrary("MySo",MySo.class);
interface JavaCallbackAdd extends Callback{
int CallbackAdd(String rec);
}
void RegisterAdd(JavaCallbackAdd callback);
//void DoAddByCallback(int a,int b);
}
public class main{
public static void main(String[] args){
MySo.JavaCallbackAdd callback = new MySo.JavaCallbackAdd(){
@Override
public int CallbackAdd(String rec){
System.out.println("-->this is Java CallbackAdd() rec :"+rec);
return 0;
}
};
/*注册回调*/
MySo.myso.RegisterAdd(callback);
while(1){
try{
Thread.sleep(100);
}catch(){
e.printStackTrace();
}
}
}
}
编译
![]()
在Environment variables中需要设定so所在目录,否则,运行会提示找不到libMySo.so
引入包
使用JNA需要引入包如下:
<dependency> <groupId>com.sun.jna</groupId> <artifactId>jna</artifactId> <version>3.0.9</version> </dependency>