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;
}