一步步编写一个AndroidStudio_NDK UDPClient 程序

来源:互联网 发布:淘宝商品名称字数限制 编辑:程序博客网 时间:2024/06/05 15:39

1.配置NDK环境

1. 打开一个项目,从菜单栏中选择 Tools > Android > SDK Manager2. 点击 SDK Tools 选项卡。3. 勾选 LLDB,CMake 和 NDK

3.点击 Apply,然后点击 OK4.当安装完成后,点击 Finish,然后点击 OK

2.创建一个支持 C/C++ 的新项目

1. Configure your new project 选项中,勾选 Include C++ Support 选项。2.点击 Next,后面的流程和创建普通的 Android studio 工程一样。3.Customize C++ Support 选项卡中:择默认 CMake 设置的Toolchain Default 选项默认即可5.点击 “Finish”。

3.工程中添加C代码

切换到Android视图

CPP文件夹会默认生成一个native-lib.cpp  
在这个文件里我们创建JNI方法,上连JAVA native方法,下通我们需要的C/C++文件我们在这里添加一个udpclient.c,并在native-lib.cpp包含该文件

native-lib.cpp 

#include <jni.h>#include <string>#include "udpclient.c"#include "base.h"extern "C" {JNIEXPORT void JNICALLJava_org_udpclient_MainActivity_sendData(JNIEnv *env, jobject instance, jstring hostName_,                                         jint portno) {    const char *hostName = env->GetStringUTFChars(hostName_, 0);    // TODO    int portno_java = portno;    LOGI("native 发送 udp function");    main_send(hostName, portno_java);    LOGI("native 发送 udp function finish");    env->ReleaseStringUTFChars(hostName_, hostName);}}


udpclient.c文件

//// Created by pactera on 2016/12/2.///* * udpclient.c - A simple UDP client * usage: udpclient <host> <port> */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include "base.h"#include <pthread.h>#define BUFSIZE 1024int main_send(const char *hostname_java, int portno_java) {    int sockfd, portno, n;    int serverlen;    struct sockaddr_in serveraddr;    char buf[BUFSIZE];    struct hostent *server;    const char *hostname;    hostname = hostname_java;    portno = portno_java;    /* socket: create the socket */    sockfd = socket(AF_INET, SOCK_DGRAM, 0);    if (sockfd < 0)        LOGE("ERROR opening socket");    /* gethostbyname: get the server's DNS entry */    server = gethostbyname(hostname);    if (server == NULL) {        LOGE("no such host as");        return -1;    }    /* build the server's Internet address */    bzero((char *) &serveraddr, sizeof(serveraddr));    serveraddr.sin_family = AF_INET;    bcopy((char *)server->h_addr,          (char *)&serveraddr.sin_addr.s_addr, server->h_length);    serveraddr.sin_port = htons(portno);    /* init message data*/    strcpy(buf,"client send message");    /* send the message to the server */    serverlen = sizeof(serveraddr);    n = (int)sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&serveraddr, serverlen);    if (n < 0)        LOGE("ERROR in sendto");    LOGI("client send complete");    n = (int)recvfrom(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&serveraddr, (socklen_t*)&serverlen);    if (n < 0)        LOGE("ERROR in recvfrom");    return 0;}

base.h文件

#ifndef UDPCLIENT_BASE_H#define UDPCLIENT_BASE_H#endif //UDPCLIENT_BASE_H#include <android/log.h>#define TAG "yueguang" // 这个是自定义的LOG的标识#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型



cmakelist中参考下面的格式进行添加,别忘记换行,在小括号的包裹范围内


5.使用JNI调用native方法

Java代码中声明native方法    public native void sendData(String hostName,int portno); Alt+Enter便可以在native-lib文件中生成对应的Jni方法,我们只要编写方法体就可以了

创建的JNI方法应该在extern "C" {....}包裹范围内,否则调用的时候会出错

Native method not found

JNIEXPORT void JNICALLJava_org_udpclient_MainActivity_sendData(JNIEnv *env, jobject instance, jstring hostName_,                                         jint portno) {    const char *hostName = env->GetStringUTFChars(hostName_, 0);    // TODO    int portno_java = portno;    LOGE("native 发送 udp function");    main_send(hostName, portno_java);    env->ReleaseStringUTFChars(hostName_, hostName);}

6.使用Android Log系统

新建个base..h把下面的代码拷贝进去 #include <android/log.h>#define TAG "yueguang" // 这个是自定义的LOG的标识#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型
 然后在需要使用AndroidLog系统的.c或.cpp文件中#include "base.h" 
//使用方法LOGE("native 发送 udp function");

========================================================
致此大工告成,运行即可
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 夏天皮肤容易痒怎么办 夏天身上老是痒怎么办 龙虾塘没水草怎么办 龙虾塘水草太多怎么办 电脑卡死黑屏怎么办 手机进入游戏时闪退怎么办? lol画面卡住了怎么办 PLSQL DEV未响应怎么办 英雄联盟载入慢怎么办 玩英雄联盟黑屏怎么办 电脑玩lol死机怎么办 输入不支援黑屏怎么办 一加玩游戏登录不了怎么办 网络连接错误711怎么办 电脑网络错误651怎么办 打游戏内存不够怎么办 电脑超频后黑屏怎么办 玩lol显示器超频怎么办 win10显示器超频黑屏怎么办 电脑开机显示超频怎么办 玩英雄联盟网卡怎么办 英雄联盟超屏怎么办 三星手机基带未知怎么办 显卡进桌面黑屏怎么办 电脑开机黑屏怎么办打开 ap黑屏打不开了怎么办 老人机屏幕变黑怎么办 电脑一直弹网页怎么办 电脑一直跳网页怎么办 电脑网页一直转圈怎么办 消费者联盟闪退怎么办 门卡住了打不开怎么办 悦平台出现bug怎么办 lol开不了全屏怎么办 韩服lol忘记密码怎么办 股票交易密码忘记了怎么办 指纹解锁密码忘记怎么办 玩lol美服有延迟怎么办 逆水寒黑屏崩溃怎么办 逆水寒游戏崩溃怎么办 lol切换黑屏了怎么办