JNI实现一组字节数组转IP地址、IP地址转数组的函数

为什么单独实现,这是因为JAVA标准库提供的函数有性能问题,它会走DNS查询有网络IO,而且还是同步阻塞的,无论是客户端还是服务器,这都应该是不被允许的行为。

JNI实现:

 bytes_to_address_string(byte[] address) 字节转IP地址字符串

string_to_address_bytes(string address)  IP地址字符串转字节

// package: com.app.android.c
// public final class libxxx 
// public native string bytes_to_address_string(byte[] address)
__LIBXXX__(jstring) Java_com_app_android_c_libxxx_bytes_1to_1address_1string(JNIEnv* env, jobject this_, jbyteArray address_) {__LIBXXX_MAIN__if (NULL == address_) {return env->NewStringUTF("0.0.0.0");}int length = env->GetArrayLength(address_);if (length < 4) {return env->NewStringUTF("0.0.0.0");}const char* address_bytes = (char*)env->GetByteArrayElements(address_, NULL);if (NULL == address_bytes) {return env->NewStringUTF("0.0.0.0");}char sz[INET6_ADDRSTRLEN];const char* r = inet_ntop(length >= 16 ? INET6_ADDRSTRLEN : AF_INET, (struct in_addr*)address_bytes, sz, sizeof(sz)); /* in6_addr */env->ReleaseByteArrayElements(address_, (jbyte*)address_bytes, 0);if (!r) {return env->NewStringUTF("0.0.0.0");}return env->NewStringUTF(sz); // inet_ntoa(*(struct in_addr*)address);
}// package: com.app.android.c
// public final class libxxx
// public native byte[] string_to_address_bytes(string address)
__LIBXXX__(jbyteArray) Java_com_app_android_c_libxxx_string_1to_1address_1bytes(JNIEnv* env, jobject this_, jstring address_) {__LIBXXX_MAIN__std::shared_ptr<app::string> address_managed = JNIENV_GetStringUTFChars(env, address_);uint8_t bytes[16];int af = 0;if (NULL == address_managed || address_managed->empty()) {*(uint32_t*)bytes = 0;af = AF_INET;}else {const char* address = NULL;if (NULL != address_managed) {address = address_managed->data();}struct sockaddr_in6 in6;int err = inet_pton(AF_INET6, address, &in6);if (err > 0) {af = AF_INET6;memcpy(bytes, &in6.sin6_addr, sizeof(bytes));}else {uint32_t addressV4 = inet_addr(address);if (addressV4 == htonl(INADDR_NONE)) {int b[4];if (sscanf(address, "%d.%d.%d.%d", &b[0], &b[1], &b[2], &b[3]) != 4) {return NULL;}}af = AF_INET;*(uint32_t*)bytes = addressV4;}}int result_count = af == AF_INET ? 4 : 16;jbyteArray result = env->NewByteArray(result_count);if (NULL == result) {return NULL;}jbyte* p = env->GetByteArrayElements(result, NULL);memcpy(p, bytes, result_count);env->ReleaseByteArrayElements(result, p, 0);return result;
}static std::shared_ptr<xxx::string>                                         JNIENV_GetStringUTFChars(JNIEnv* env, const jstring& v) noexcept {std::shared_ptr<xxx::string> result;if (NULL != v) {char* s = (char*)env->GetStringUTFChars(v, NULL);if (NULL != s) {result = xxx::make_shared_object<xxx::string>(s);env->ReleaseStringUTFChars(v, s); }}return result;
}

Java:

    // Convert a string to an IP address.@Nullablepublic static InetAddress string_to_address(String address) {try {byte[] V = libxxx.c.string_to_address_bytes(address);if (V == null) {return null;} else {return address_of(V);}} catch (Throwable ignored) {return null;}}// Convert a bytes to an IP address string.public static String bytes_to_address_string(byte[] address) {return libxxx.c.bytes_to_address_string(address);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 遍历map的3中方法

方法1 #include <iostream> #include <string> #include <map> using namespace std;int main() {map<string, string> nameList {{"张三丰", "武当山"},{"张无忌", "光明顶"},{"张二蛋", "…

二叉树基本概念与遍历

什么是二叉树 二叉树不同于别的树&#xff0c;因为他每个节点最多只有两个子节点&#xff0c;而别的树可以有无数个子节点。 所以二叉树就是只最多只有两个子节点的树&#xff0c;一个子节点叫右子节点&#xff0c;另一个子节点叫左子结点 而他们的上一层就是父子节点&#xf…

航班进出港|航班进出港管理系统|基于springboot航班进出港管理系统设计与实现(源码+数据库+文档)

航班进出港管理系统目录 目录 基于springboot航班进出港管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 5、航班信息管理 &#xff08;1&#xff09; 航班信息管理 &#xff08;2&#xff09;起飞降落申请管理 &#xff08;3&#xff09;公告管理 &…

城市智慧驿站是什么?城市智慧驿站有哪些功能

城市智慧驿站作为一种创新性的社会配套设施&#xff0c;开始在多个城市落地使用&#xff0c;引起了社会的关注。 城市智慧驿站是什么&#xff1f;城市智慧驿站是在智慧城市的背景下&#xff0c;城市智慧驿站智慧公厕成为了一种创新性的社会配套建筑。作为景观式模块化建筑&…

UE蓝图 分支(Branch)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 文章目录 系列文章目录一、分支节点功能二、分支节点用法三、分支节点使用场景四、分支节点实现过程五、分支节点相关源码 一、分支节点功能 在Unreal Engine&a…

Mysql数据库主从集群从库Slave因为RelayLog过多过大引起服务器硬盘爆满生产事故实战解决

Mysql数据库主从集群从库slave因为RelayLog过多过大引起从库服务器硬盘爆满生产事故实战解决 一、MySQL数据库主从集群概念 MySQL数据库主从集群是一种高可用性和读写分离的数据库架构&#xff0c;它基于MySQL的复制&#xff08;Replication&#xff09;技术来同步数据。在主…

【Kotlin】Kotlin流程控制

1 选择结构 Kotlin 中选择结构主要包含 if -else、when 语句&#xff0c;并且可以返回结果。 1.1 if-else 1.1. 条件选择 fun main() {var score 85if (score > 90) {println("优秀")} else if (score > 80) {println("良好")} else if (score &…

信息安全法律法规体系

信息安全法律法规体系 我国信息安全法规体系可以分为4层。 法律层面具体对应的法律、法规一般性法律规定宪法、国家安全法、国家秘密法、治安管理处理条例等虽然没有专门针对信息安全的条款,但约束了信息安全相关的行为规范和惩罚信息网络犯罪的法律《中华人名共和国刑法》《…

17.2 SpringMVC框架_Restful开发风格

Restful开发风格 1. Restful风格介绍1.1 传统Web应用1.2 REST与RESTful1.3 RESTful数据传输1.4 RESTful开发规范1.5 RESTful命名要求(❤❤)2. RESTful开发实战2.1 maven项目添加web应用2.2 依赖2.3 请求响应2.4 @RestController注解2.5 @PathVariable注解2.6 简单请求与非简单请…

如何交接一个前端项目

一.在非交接状态下&#xff0c;需要做好的事情 必要的代码注释必要的文档梳理 readme即可&#xff0c;记录重要的信息方便自己查阅、方便新的伙伴快速了解项目 二.交接readme 2.1项目相关的网址 项目git地址不同环境的访问权限&#xff08;或者对应的测试账号/密码&#xf…

MySQL篇之主从同步原理

一、原理 MySQL主从复制的核心就是二进制日志。 二进制日志&#xff08;BINLOG&#xff09;记录了所有的 DDL&#xff08;数据定义语言&#xff09;语句和 DML&#xff08;数据操纵语言&#xff09;语句&#xff0c;但不包括数据查询&#xff08;SELECT、SHOW&#xff09;语句。…

19-树-填充每个节点的下一个右侧节点指针 II

这是树的第19篇算法&#xff0c;力扣链接。 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。…

继ChatGPT后的又一王炸!Sora模型解析与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

Linux----防火墙之保存规则

一、关于iptables规则的保存 之前写的iptables的设置&#xff0c;但是都是临时生效的&#xff0c;一旦电脑重启&#xff0c;那么就会失效&#xff0c;如何永久保存&#xff0c;需要借助iptables-save命令&#xff0c;开机生效需要借助iptables-restore命令&#xff0c;并写入规…

“薪”的一年程序员裁员潮技术变革情况下 程序员就业机会在哪里?

引言&#xff1a;一对来自中国的工程师夫妻在美国的不幸身亡&#xff0c;疑似与谷歌的裁员有关&#xff0c;这一事件再次引发了人们对技术变革下裁员对程序员影响的关注。 一、针对裁员潮的一些看法 在我看来&#xff0c;技术变革对程序员的影响是双面的。一方面&#xff0c;…

代码随想录算法训练营day16

题目&#xff1a;104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 参考链接&#xff1a;代码随想录 104.二叉树的最大深度 思路&#xff1a;上次是用层序遍历的思路做过。这次想一点不一样的思路&#xff0c;对于一个二叉树的最大深度其实即为其两个…

【Python机器学习】详解Python机器学习进行时间序列预测

&#x1f517; 运行环境&#xff1a;Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

Linux文件系统笔记

文章目录 FILE SYSTEM软硬链接 动静态库 使用别人提供的库 FILE SYSTEM 文件的管理工作&#xff1a; 1.基础知识&#xff1a; 文件 属性 内容不是所有文件都会打开所有的打开的&#xff0c;未打开的文件会进行管理未打开文件&#xff0c;要能做到快速定位文件磁盘–物理存…

C++:const关键字

一、const成员变量(常成员变量) 1、只能使用初始化列表对常成员变量进行初始化&#xff1b; 2、常成员变量可以被访问&#xff0c;但是不能被修改&#xff1b; 3、类中所有构造函数都必须在初始化列表对常成员函数进行初始化(包括拷贝构造&#xff0c;移动构造)。 声明&am…

加固平板电脑在无人机的应用|亿道三防onerugged

无人机技术的快速发展已经在许多领域展现出巨大潜力&#xff0c;而加固平板电脑的应用在无人机领域中扮演着重要角色。 首先&#xff0c;加固平板电脑在无人机探测设备中发挥着关键作用。无人机探测设备通常需要实时传输高清图像和数据&#xff0c;以支持各种监测、勘测和检测…