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.hqwc.cn/news/442595.html

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

相关文章

操作系统基础:进程同步【中】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 进程同步&#xff08;中&#xff09;1.1 信号量机制1.1.1 总览1.1.2 什么是信号量机制1.1.2.1 什么是信号量1.1.2.2 什么是原语1.1.2.3 "一对原语" 指的是什么…

SD卡写保护无法格式化怎么办?

一般来说&#xff0c;写保护&#xff08;也称为只读&#xff09;是数据存储设备防止写入新数据或修改旧信息的能力。换句话说&#xff0c;您可以读取存储在磁盘上的信息&#xff0c;但是却不能删除、更改或复制它们&#xff0c;因为访问会被拒绝。那么SD卡有写保护怎么格式化呢…

【方法】RAR分卷压缩文件如何打开?

当RAR压缩文件比较大&#xff0c;不利于传输时&#xff0c;我们可以把文件压缩成分卷文件&#xff0c;那压缩后的分卷文件如何打开呢&#xff1f;今天就来说说RAR分卷压缩文件的两种打开方法。 方法一&#xff1a; 和普通压缩包一样&#xff0c;打开分卷压缩包也需要用到解压…

数据结构day7

1.思维导图 1.二叉树递归创建 2.二叉树先中后序遍历 3.二叉树计算节点 4.二叉树计算深度。 5.编程实现快速排序降序

git clone常见问题一览及解决方法

在使用Ubuntu下&#xff0c;终端运行git clone命令时会遇见许多问题&#xff0c;本文主要针对一些常见的问题进行整理。关于换源问题&#xff0c;推荐使用小鱼的一键换源。 1.git clone 速度过慢 1.1 魔法 这个方法不做过多赘述&#xff0c;ubuntu下个人使用发现体验良好&am…

c++的并发操作(多线程)和 while 优先级 已解决

C11标准在标准库中为多线程提供了组件&#xff0c;这意味着使用C编写与平台无关的多线程程序成为可能&#xff0c;而C程序的可移植性也得到了有力的保证。另外&#xff0c;并发编程可提高应用的性能&#xff0c;这对对性能锱铢必较的C程序员来说是值得关注的。 1. 何为并发 …

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。文件&…

编译opencv4.6问题汇总,第三方软件包见我发的资源

win10系统 python3.8.2&#xff0c;cmake-3.15.5-win64-x64&#xff0c;opencv4.6 编译方式见&#xff1a;OpenCV的编译 - 知乎 本文主要总结问题。赠人玫瑰手留余香。 问题1 Problem with installing OpenCV using Visual Studio and CMake (error code: MSB3073) 解决方法…

Qt+css绘制标题

之前学过html和小程序&#xff0c;帮老师做项目的时候也用过vue&#xff0c;在想qt绘制界面是不是也可以使用css,然后查了一些资料&#xff0c;绘制了一个标题&#xff0c;准备用到智能家居的上位机上面。 成果 源码 重写了paintEvent函数和TimeEvent函数&#xff0c;一个用于绘…

CAM350开短路检查操作

本质: 使用CAM350进行开短路检查,实际就是从Gerber文件中提取网表与从Allegro中产生的IPC-D-356A格式网表进行比较。 1.首先打开CAM350,导入网表: 2.设置各层的属性类型: (1)精度设置,这里需要和Allegro中出Gerber文件时设置的精度保持一致,坐标和零压缩设置保持默认…

抵御.360勒索病毒威胁:解密文件的有效方法与预防措施

导言&#xff1a; 近来&#xff0c;网络犯罪的一种新型形式——.360勒索病毒&#xff0c;备受关注。这种病毒通过加密用户文件&#xff0c;要求支付赎金以获取解密密钥。本文91数据恢复将深入介绍.360勒索病毒的特点&#xff0c;同时提供一些有效的恢复方法&#xff0c;并分享…

docker在windows创建卷后本地找不到

使用 docker volume create html 创建卷之后虽然能成功创建&#xff0c;但是通过 docker inspect html 查看文件地址时给出的Mountpoint地址却是 D:\nacos\docker>docker inspect html [{"CreatedAt": "2024-01-31T03:51:23Z","Driver":…