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类,生成头文件

编写一个如下的类:

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目录下,执行下面命令:

java 复制代码
javah -jni com.kindo.nhzk.SendDocument

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

java 复制代码
/* 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文件,如下:

cpp 复制代码
#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

执行下面的命令:

cpp 复制代码
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下。

相关推荐
神仙别闹5 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
伞伞悦读6 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
free-elcmacom8 小时前
C语言字符指针与字符串字面量——从一道“剑指 Offer”笔试题说起
c语言·visual studio
2601_966949659 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
m0_734571769 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
RAN114267600810 小时前
1.3第一个程序的介绍
开发语言·qt
blue_ice .11 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^1382879887211 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
泡海椒12 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)12 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm