java生成dll,并利用c语言使用libcurl调用http接口

本文可能需要使用的环境和工具:

c/ c++和GCC编译器

(Windows) Cygwin或MinGW

本文运行环境为windows10,使用MinGW-W64-builds-4.2.0

curl-8.5.0

libcurl 可以在官网 http://curl.haxx.se/ 获得。

  • 配置MinGW

将mingw.rar解压到D:,修改系统环境变量path,将D:\mingw\bin加入

打开cmd,输入gcc -v验证

  • 编译curl

将curl-8.5.0.zip解压到D:,打开cmd,cd进入到D:\curl-8.5.0

执行下面命令:

mingw32-make mingw32
  • 编写java类,生成头文件

编写一个如下的类:

package com.kindo.nhzk;public class SendDocument {static {System.loadLibrary("kindolib");}public native void send(String data);public static void main(String[] args) {new SendDocument().send("{\"data\":[{\"sex\":1,\"age\":56,\"bornWt\":0,\"LOS\":6,\"statusOut\":2,\"PDX\":\"I21.000x005\",\"ADX1\":\"A02.100\",\"ADX2\":null,\"ADX3\":\"\",\"ADX4\":\"\",\"ADX5\":\"\",\"ADX6\":\"\",\"ADX7\":\"\",\"ADX8\":\"\",\"ADX9\":\"\",\"ADX10\":\"\",\"ADX11\":\"\",\"ADX12\":\"\",\"ADX13\":\"\",\"ADX14\":\"\",\"ADX15\":\"\",\"PROC1\":\"\",\"PROC2\":\"\",\"PROC3\":\"\",\"PROC4\":\"\",\"PROC5\":\"\",\"PROC6\":\"\",\"PROC7\":\"\",\"PROC8\":\"\"}]}");}
}

使用javac或idea进行编译,编译后进入到class目录下,执行下面命令:

javah -jni com.kindo.nhzk.SendDocument

此时会生成一个com_kindo_nhzk_SendDocument.h,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_kindo_nhzk_SendDocument */#ifndef _Included_com_kindo_nhzk_SendDocument
#define _Included_com_kindo_nhzk_SendDocument
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_kindo_nhzk_SendDocument* Method:    send* Signature: (Ljava/lang/String;)V*/
JNIEXPORT void JNICALL Java_com_kindo_nhzk_SendDocument_send(JNIEnv *, jobject, jstring);#ifdef __cplusplus
}
#endif
#endif
  • 编写c语言实现

在该目录下创建一个kindolib.c文件,如下:

#include "com_kindo_nhzk_SendDocument.h"
#include <stdio.h>
#include <curl/curl.h>JNIEXPORT void JNICALL Java_com_kindo_nhzk_SendDocument_send(JNIEnv *env, jobject obj, jstring str) {CURL *curl;CURLcode res;curl_global_init(CURL_GLOBAL_ALL);curl = curl_easy_init();//HTTP报文头  struct curl_slist* headers = NULL;if(curl) {const char *inCStr = (*env)->GetStringUTFChars(env, str, NULL);printf("In C, the received string is: %s\n", inCStr);headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");// 设置请求地址curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.134:8880/cdrg-1.0/cdrg");// 设置请求头信息curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 设置请求超时时间curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 3000);// 设置请求体curl_easy_setopt(curl, CURLOPT_POSTFIELDS, inCStr);curl_easy_setopt(curl, CURLOPT_POST, 1);res = curl_easy_perform(curl);if(res != CURLE_OK)fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));printf("ok");curl_slist_free_all(headers);curl_easy_cleanup(curl);(*env)->ReleaseStringUTFChars(env,str,inCStr);}curl_global_cleanup();}
  • 编译c程序为dll

执行下面的命令:

gcc -c -I%JAVA_HOME%/include -I%JAVA_HOME%/include/win32 -ID:\curl-8.5.0\include -LD:\curl-8.5.0\lib -DCURL_STATICLIB -lcurl kindolib.cgcc -I$JAVA_HOME/include -I%JAVA_HOME%/include -I%JAVA_HOME%/include/win32 -ID:\curl-8.5.0\include -LD:\curl-8.5.0\lib -shared -o kindolib.dll kindolib.o -lcurl

上面使用了JAVA_HOME环境变量,D:\curl-8.5.0为curl库目录

  • 使用java验证和运行

将编译好的kindolib.dll 和 libcurl.dll放到JAVA_HOME\bin(也就是java.library.path)下执行上面的SendDocument类:

libcurl.dll是运行的依赖,最终需要kindolib.dll 和 libcurl.dll在同一个目录下,此文件在D:\curl-8.5.0\lib下。

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

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

相关文章

Java面试题之 IO(四)

Java面试题之 IO&#xff08;四&#xff09; 文章目录 Java面试题之 IO&#xff08;四&#xff09;随机访问流 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 随机访问流 这里要介绍的随机访问流指的是支持随意跳转到文件的任意位置进行读写的 RandomAccessFile 。…

防火墙综合拓扑(NAT、双机热备)

实验需求 拓扑 实验注意点&#xff1a; 先配置双机热备&#xff0c;再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致如果其中一台防火墙有过配置&#xff0c;最好清空或重启&#xff0c;不然配置会同步失败两台防火墙同步完成后&#xff0c;可以直接在主状态防火墙…

浅谈WPF之UniformGrid和ItemsControl

在日常开发中&#xff0c;有些布局非常具有规律性&#xff0c;比如相同的列宽&#xff0c;行高&#xff0c;均匀的排列等&#xff0c;为了简化开发&#xff0c;WPF提供了UniformGrid布局和ItemsControl容器&#xff0c;本文以一个简单的小例子&#xff0c;简述&#xff0c;如何…

TSINGSEE青犀智能分析网关V4—让加油站迈入AI智能检测时代

一、背景与需求 中国目前建设加油站超过10万个&#xff0c;作为高危场所对于烟火&#xff0c;危险区域管控、消防器材等管理要求严格&#xff0c;稍有不慎即酿成大祸。由于春节临近&#xff0c;加油站各类人员进出频繁&#xff0c;安全意识较低&#xff0c;依靠普通监控人力的…

java常量和kotlin常量

在java中使用final声明常量在kotlin中使用const val声明常量 常量在编译为字节码后会直接把调用常量的地方直接替换为常量值&#xff0c;示例如下&#xff1a; public class ConstDemo {public static final String NAME "Even";private static final int ID 100…

海外云手机开辟企业跨境电商新道路

近几年&#xff0c;海外云手机为跨境电商、海外媒体引流、游戏行业等互联网领域注入了蓬勃活力。对于国内跨境电商而言&#xff0c;在亚马逊及其他平台上&#xff0c;短视频引流和社交电商营销成为最为有效的流量来源。如何通过海外云手机的助力&#xff0c;在新兴社交平台为企…

python二维高斯热力图绘制简单的思路代码

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …

【遥感专题系列】遥感影像信息提取之——人工目视解译

​遥感影像通过亮度值或像元值的高低差异&#xff08;反映地物的光谱信息&#xff09;及空间变化&#xff08;反映地物的空间信息&#xff09;来表示不同地物的差异&#xff0c;这是区分不同影像地物的物理基础。 ​人工解译是目前国内使用最多的一种影像提取方法&#xff0c;如…

力扣hot100 单词搜索 深度优先搜索 特殊字符判重

Problem: 79. 单词搜索 Code class Solution{int n, m;char[][] b;String word;int[] dx { 1, 0, -1, 0 };int[] dy { 0, 1, 0, -1 };public boolean exist(char[][] board, String word){b board;this.word word;n b.length;m b[0].length; // 以所有点作为起点来进行…

生词本----Python实例练习

题目描述 背单词是英语学习中最基础的一环&#xff0c;不少学生在背诵单词的过程中会整理自己的生词本&#xff0c;以不断拓展自己的词汇量。本实例要求编写生词本程序&#xff0c;该程序需具备以下功能。 &#xff08;1&#xff09;查看生词列表功能&#xff1a;输出生词本中…

系统分析师-22年-下午题目

系统分析师-22年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选其中两题作答 试题一 (25分) 说明 某软件公司拟开发一套博客系统&#xff0c;要求能够向用户提供一个便捷发布自已心得&#xff0c;及时有效的…

腾讯云SDK并发调用优化方案

目录 一、概述 二、 网关的使用 2.1 核心代码 三、腾讯云SDK依赖包的改造 一、概述 此网关主要用于协调腾讯云SDK调用的QPS消耗&#xff0c;使得多个腾讯云用户资源能得到最大限度的利用。避免直接使用腾讯云SDK 时&#xff0c;在较大并发情况下导致接口调用异常。网关的工…

Yolo v8 入门学习之采用 coco128 数据集进行图片检测测试

示例入门代码 from ultralytics import YOLO import cv2 import matplotlib.pyplot as plt import matplotlib.image as mpimgdef test():# Create a new YOLO model from scratchmodel YOLO(yolov8n.yaml)# Load a pretrained YOLO model (recommended for training)model …

Redis -- 开篇热身,常用的全局命令

目录 Redis重要文件 启动停止脚本 配置文件 持久化文件存储目录 核心命令 set get 全局命令 keys exists del expire ttl 过期策略是如何实现的 定时器 type 小结 Redis重要文件 启动停止脚本 /usr/bin/redis-benchmark &#xff1a; 用于对Redis做性能基准…

SpringCloud_学习笔记_1

SpringCloud01 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

opencv学习 特征提取

内容来源于《opencv4应用开发入门、进阶与工程化实践》 图像金字塔 略 拉普拉斯金字塔 对输入图像进行reduce操作会生成不同分辨率的图像&#xff0c;对这些图像进行expand操作&#xff0c;然后使用reduce减去expand之后的结果&#xff0c;就会得到拉普拉斯金字塔图像。 …

【开源操作系统】上海道宁为您带来稳定、安全、开源和易用的操作系统——Ubuntu,为您的数字化生活保驾护航

Ubuntu是 源于非洲的一种传统价值观 意为“人性、关爱和共享” 这种价值观在 开源、稳定、安全、易用的 Ubuntu操作系统中 得到了完美的体现 除此之外&#xff0c;Ubuntu还具有 强大的安全性 它自带了诸多安全功能 如防火墙、加密文件系统等 可以有效地保护用户的隐私…

你ping一下,服务器累成狗--第二篇

你ping一下&#xff0c;服务器累成狗-目录篇文章浏览阅读1.7k次&#xff0c;点赞65次&#xff0c;收藏20次。我们的电脑怎么干活的https://blog.csdn.net/u010187815/article/details/135796967 你ping一下&#xff0c;服务器累成狗--第一篇文章浏览阅读62次&#xff0c;点赞6…

C#用正则表达式验证格式:电话号码、密码、邮编、手机号码、身份证、指定的小数点后位数、有效月

正则表达式在程序设计中有着重要的位置&#xff0c;经常被用于处理字符串信息。 用Regex类的IsMatch方法&#xff0c;使用正则表达式可以验证电话号码是否合法。 一、涉及到的知识点 Regex类的IsMatch方法用于指示正则表达式使用pattern参数中指定的正则表达式是否在输入字符串…

IntersectionObserver、MutationObserver应用,监听项目中指定属性数据,点击或模块显示时

当项目中&#xff0c;需要获取某个页面上、某个标签上、有指定自定义属性时&#xff0c;需要在点击该元素时进行公共逻辑处理&#xff0c;或该元素在显示的时候进行逻辑处理&#xff0c;这时可以定义一个公共的方法&#xff0c;在每个页面引用&#xff0c;并写入数据即可 &…