Android 与 native C 利用本地socket进行消息传递
Java源码:
// 服务器端 import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.util.Log; public class SocketListener extends Thread { @Override public void run() { Log.i(getClass().getName(), "run()"); try { LocalServerSocket server = new LocalServerSocket("com.example.mysoftphone.localsocket"); while (true) { LocalSocket receiver = server.accept(); Log.i(getClass().getName(), "server.accept()"); if (receiver != null) { InputStream input = receiver.getInputStream(); InputStreamReader inputReader = new InputStreamReader(input); BufferedReader bufferReader = new BufferedReader(inputReader); String line = bufferReader.readLine(); // String line1 = new String(line.getBytes("UTF-8")); Log.i(getClass().getName(), line); } } } catch (Exception e) { Log.e(getClass().getName(), e.getMessage()); } finally { } } }
C代码:
// 客户端 #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <android/log.h> #define THIS_FILE "ipc_client.c" int send_remote_request(char *msg, int size) { int result; int len; int namelen; int localsocket; struct sockaddr_un remote; char *name = "com.example.mysoftphone.localsocket";//与java上层相同哦 localsocket = socket(AF_UNIX, SOCK_STREAM, 0); if (localsocket == -1) { __android_log_print(ANDROID_LOG_ERROR, THIS_FILE, "socket failed!"); return -1; } remote.sun_family = AF_UNIX; remote.sun_path[0] = '\0'; /* abstract namespace */ strcpy(remote.sun_path+1, name); namelen = strlen(name); len = 1 + namelen + offsetof(struct sockaddr_un, sun_path); result = connect(localsocket, (struct sockaddr *)&remote, len); if (result == -1) { __android_log_print(ANDROID_LOG_ERROR, THIS_FILE, "connect failed!"); return -1; } result = send(localsocket, msg, size,0); if (result == -1) { __android_log_print(ANDROID_LOG_ERROR, THIS_FILE, "send failed!"); return -1; } close(localsocket); return 0; }