本文2017-3-14
基本环境:
1. 操作系统:Windows10 64位;
2. Android Studio 2.3,64位。
3. Android NDK开发包:直接使用Android Studio安装NDK。(需要梯子)
4.按照上述按照上述第一编译好的NDK Hello World程序
操作步骤:
第一步、准备接受端,使用VC,Windows下编译执行,代码如下:
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
int main()
{
WSADATA wsaData = {0};
int nRet = WSAStartup(MAKEWORD(2,2), &wsaData);
SOCKET sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
sockaddr_in sockAddr = {0};
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = INADDR_ANY;
sockAddr.sin_port = htons(10000);
nRet = bind(sockServer, (SOCKADDR*)&sockAddr, sizeof(sockaddr_in));
nRet = listen(sockServer, SOMAXCONN);
int nSockAddr = sizeof(sockaddr_in);
SOCKET sockClient = ::accept(sockServer, (SOCKADDR*)&sockAddr, &nSockAddr);
char szMsg[1024] = {0};
nRet = recv(sockClient, szMsg, sizeof(szMsg), 0);
printf ("recv: %s\n", szMsg);
closesocket(sockClient);
closesocket(sockServer);
getchar();
return 0;
}
第二步,在native-lib.cpp修改,代码如下
#include <jni.h>
#include <string>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_szboot_mysockapp_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
int sockClient = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in sockAddr = {0};
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr("192.168.6.164");
sockAddr.sin_port = htons(10000);
int nRet = connect(sockClient, (sockaddr*)&sockAddr, sizeof(sockaddr_in));
char szMsg[1024] = "andriod hello socket!";
nRet = send(sockClient, szMsg, strlen(szMsg), 0);
return env->NewStringUTF(hello.c_str());
}
【注意】,其中inet_addr("192.168.6.164")修改为电脑执行接收端的实际IP地址。
第三步,在AndroidManifest.xml中,添加app网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>
将电脑和安卓设备(手机)连接到同一局域网中,先执行Windows接收端,再在Andriod端执行这个app,就可以在接收端看到“recv: andriod hello socket!”消息了。