1
我在嘗試將BSD客戶端套接字連接到服務器時遇到一些問題。 使用JNI實現套接字創建和連接。實際的連接是通過java代碼建立的。Android BSD套接字連接
JNI部分:
#include <jni.h>
#include <unistd.h>
#include <string.h>
#include <sys/endian.h>
#include <sys/ioctl.h>
#include <sys/errno.h>
#include <sys/socket.h>
#include <sys/poll.h>
#include <netinet/in.h>
JNIEXPORT jint JNICALL Java_com_example_socketclinet_Native_socket
(JNIEnv *, jclass, jint, jint, jint);
JNIEXPORT jint JNICALL Java_com_example_socketclinet_Native_connect
(JNIEnv *, jclass, jint, jint, jint);
jint JNICALL Java_com_example_socketclinet_Native_socket
(JNIEnv *env, jclass cls, jint domain, jint type, jint protocol)
{
return socket(domain, type, protocol);
}
jint JNICALL Java_com_example_socketclinet_Native_connect
(JNIEnv *env, jclass cls, jint socket, jint address, jint port)
{
struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(address);
addr.sin_port = htons(port);
return connect(socket, (const struct sockaddr *)&addr, sizeof(struct sockaddr_in));
}
Java本地橋類:
class Native
{
static
{
System.loadLibrary("mylib");
}
public static final int SOCK_STREAM = 2;
public static final int AF_INET = 2;
public static native int socket(int domain, int type, int protocol);
public static native int connect(int socket, int address, int port);
}
機類的用法:
int socket = Native.socket(Native.AF_INET, Native.SOCK_STREAM, 0);
if (socket < 0)
{
System.err.println("Socket error: " + socket);
return;
}
byte[] address = { .... }; // 192.168.xxx.xxx
int addr = address[0] << 24 | address[1] << 16 | address[2] << 8 | address[3];
int port = ....;
int result = Native.connect(socket, addr, port);
if (result < 0)
{
System.err.println("Connection failed: " + result);
}
else
{
System.out.println("Connected");
}
「連接」 方法總是返回 「0」,即使沒有服務器在運行(在設備和模擬器上)。
•我有「INTERNET」許可與清單文件設置(如果沒有它「套接字」函數返回-1)
•相同的代碼工作完全正常在iOS和Mac OS。
•測試環境:Nexus 5(4.4.4),android-ndk-r10d
任何幫助將不勝感激!
您無法將TCP套接字連接到廣播地址。 – EJP
@Digit,它沒有工作。另外,試圖在本地代碼中對地址進行硬編碼 - 沒有運氣。我最終在java中編寫socket通信代碼並添加了一個JNI綁定(像魅力一樣工作)。 –