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

news2024/11/15 13:52:32

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

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.c

gcc -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.coloradmin.cn/o/1422989.html

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

相关文章

软件压力测试:探究其目的与重要性

随着软件应用在各行各业中的广泛应用&#xff0c;确保软件在高负载和极端条件下的稳定性变得至关重要。软件压力测试是一种验证系统在不同负载条件下的性能和稳定性的方法。本文将介绍软件压力测试的目的以及为什么它对软件开发和部署过程至关重要。 验证系统性能的极限&#x…

C#: 软件任务栏托盘图标添加关闭软件菜单等

说明&#xff1a;在软件在任务栏右下角的系统托盘的图标添加个右键弹出菜单功能&#xff0c;案例实现右键弹窗菜单关闭软件功能。 1.添加系统托盘图标控件 NotifyIcon 2.右键打开控件属性菜单添加鼠标点击事件函数 3.事件函数添加代码 //右键点击任务栏图标弹出关闭菜单 priv…

python爬虫之豆瓣首页图片爬取

网址&#xff1a;https://movie.douban.com/ import requests from lxml import etree import re url https://movie.douban.com headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/5…

【Java-JDK】JDK 的安装与环境变量的配置:Windows Linux

【Java-JDK】JDK的安装与环境变量的配置&#xff1a;Windows & Linux 1&#xff09;Windows安装JDK1.1.下载JDK1.1.安装JDK1.2.JDK环境配置1.3.验证环境变量是否配置成功 2&#xff09;Linux安装JDK2.1.下载JDK2.2.安装JDK2.3.JDK环境配置2.4.验证环境变量配置是否成功 1&a…

OpenFeign认证上下文信息的传递

基本思路 其中网关部分不是本章讨论的范围,网关处理与后续服务的处理类似。 发送处理:将认证信息植入到请求信息中接收处理:从请求头中获取到认证信息,并解析为用户信息,供后续业务使用。有两个思路: 将认证信息放到请求头中,向下传递。这种方式适用于用户认证上下文中信…

githacker安装详细教程,linux添加环境变量详细教程(见标题三)

笔者是ctf小白&#xff0c;这两天也是遇到.git泄露的题目&#xff0c;需要工具来解决问题&#xff0c;在下载和使用的过程中也是遇到很多问题&#xff0c;写此篇记录经验&#xff0c;以供学习 在本篇标题三中有详细介绍了Linux系统添加环境变量的操作教程&#xff0c;以供学习 …

242. 有效的字母异位词(力扣)(C语言题解)

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 前提&#xff1a; 看本文章之前&#xff0c;建…

【期末】openGL基础知识+编程题

头文件的使用 若应用程序使用OpenGL核心函数&#xff0c;应包括头文件<gl/gl.h> 使用GLU库函数&#xff0c;应包括头文件<gl/glu.h> 使用AUX库函数&#xff0c;应包括头文件<gl/glaux.h> 使用WGL和Win32应包括头文件<windows.h>基本程序结构 1.定…

uniCloud快速上手

uniCloud快速上手 hello uniCloud Hello uniCloud&#xff0c;是一个示例&#xff0c;演示了 uniCloud 的各种能力。 体验示例 这个示例目前只发布了h5版本和Android app版。 Hello uniCloud部署了2套&#xff0c;分别连接uniCloud的阿里云版和腾讯云版。 h5版地址&#x…

abap_bool 类型

abap_bool 类型 abap_bool 有两种abap_true和abap_false&#xff0c;abap_true代表x&#xff0c;abap_false是空

林浩然的编程奇遇记:从“单词精灵”到“英语全能小助手”

林浩然的编程奇遇记&#xff1a;从“单词精灵”到“英语全能小助手” Lin Haoran’s Programming Adventure: From “Word Wizard” to “English All-in-One Assistant” 在那个代码编织而成的奇妙世界里&#xff0c;我们有幸遇见了一位名叫林浩然的程序员小哥。他可不是那种埋…

ping: connect: Resource temporarily unavailable

问题 主机ping自己或者其他的设备报错如下 ping: connect: Resource temporarily unavailable 看了下网络上的其他说法&#xff0c;大多说是下面的两个限制 1.网络连接队列的大小 2.系统级别的最大文件描述符数量 根因分析 调整连接队列和最大文件描述符数&#xff0c;问题仍…

[Mac软件]Amadeus Pro 2.8.13 (2662) Beta多轨音频编辑器激活版

应用介绍 Amadeus pro for mac是Mac os平台上的一款功能非常强大的Mac音乐编辑器&#xff0c;Amadeus pro for mac是一款强大的多轨音频编辑器&#xff0c;支持多种格式&#xff0c;如MP3, AAC, Ogg Vorbis, Apple Lossless, AIFF, Wave等。 多轨编辑 Amadeus Pro是一个功能齐…

微软Azure-openAI 测试调用及说明

本文是公司在调研如何集成Azure-openAI时&#xff0c;调试测试用例得出的原文&#xff0c;原文主要基于官方说明文档简要整理实现 本文已假定阅读者申请部署了模型&#xff0c;已获取到所需的密钥和终结点 变量名称值ENDPOINT从 Azure 门户检查资源时&#xff0c;可在“密钥和…

微信小程序(二十八)网络请求数据进行列表渲染

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.GET请求的规范 2.数据赋值的方法 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item">&…

【全csdn最前沿LVGL9】基础对象lv_obj

文章目录 前言一、LVGL9的下载二、基础对象lv_obj2.1 概述2.2 布局2.3 lv_obj的使用创建一个lv_obj设置大小设置位置设置对齐父对象与子对象事件 总结 前言 LVGL&#xff08;LittlevGL&#xff09;是一个开源的嵌入式图形库&#xff0c;用于在嵌入式系统中创建用户界面。LVGL提…

亚信安慧AntDB:分布式数据库的崛起与挑战

亚信安慧AntDB 是国产的分布式数据库&#xff0c;它具备快速发展的潜力。随着互联网技术的迅猛发展&#xff0c;大数据时代的到来&#xff0c;数据库的需求不断增长。在这样的背景下&#xff0c;国产分布式数据库正逐渐崭露头角&#xff0c;AntDB作为其中的重要代表&#xff0c…

新东方财报解读:新一轮增长逻辑或蕴于电商业务?

从财报表现来看&#xff0c;教育市场的元气在持续提升。 近日&#xff0c;新东方、好未来等上市公司陆续公布了2023年9-11月的业绩表现。其中&#xff0c;好未来实现营收3.7亿美元&#xff0c;同比增长60.5%&#xff1b;归母净亏损2394.6万美元&#xff0c;亏幅同比收窄53.6%。…

C/C++ - 类的多态机制

目录 多态概念 多态定义 多态的触发机制 虚函数 虚函数表 虚析构函 虚析构函数声明 虚析构函数的作用 纯虚函数 纯虚函数的声明 纯虚函数的作用 抽象类 多态原理 虚函数表 & 虚函数指针 继承机制下的虚函数表 动态绑定 多态概念 狗狗发出的声音为 -> 旺…

【C语言】整数和浮点数在内存中的存储

前言 我们都知道&#xff0c;在创建一个变量的时候&#xff0c;编译器会自动开辟一块内存空间用于存放它&#xff0c;但是对于不同的数据类型&#xff0c;它们的存储形式也会有所不同。今天就让我们一起来学习整数和浮点数在内存中的存储 1. 整数在内存中的存储 我们都知道&…