本文可能需要使用的环境和工具:
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下。