java调用c++动态库
来源:互联网 发布:kvm linux 编辑:程序博客网 时间:2024/06/06 07:41
第一步:编写Java代码,使用关键字native标记要用C++动态链接库来实现的方法。
譬如:fxq.java
package com.szkingdom.kssp.util;
public class fxq {
private static boolean init = false;
static {
System.loadLibrary("fxq");
init = (0 == InitDLL ());
}
public fxq() {}
public static int processKY (String batchId) {
if(init) {
return ProcessKY(batchId);
}
return -1;
}
public static int processBig (String batchId) {
if(init) {
return ProcessBig(batchId);
}
return -1;
}
public static int reCreateKY (String batchId, String oldFileName) {
if(init) {
return ReCreateKY(batchId, oldFileName);
}
return -1;
}
public static int reCreateBig (String batchId, String oldFileName) {
if(init) {
return ReCreateBig(batchId, oldFileName);
}
return -1;
}
public synchronized static native int InitDLL ();
public synchronized static native int ProcessKY (String batchId);
public synchronized static native int ProcessBig (String batchId);
public synchronized static native int ReCreateKY (String batchId, String oldFileName);
public synchronized static native int ReCreateBig (String batchId, String oldFileName);
}
注意:
native 方法没有方法实现。
第二步:编译fxq.java,.将fxq.java,fxq.class 放在同一个文件夹cj下面
而后用javah命令生成一个C++头文件 fxq.h
如:
Javah fxq
注意使用类名,非文件名
第三步:实现fxq.h,编写C++代码。
参考fxq.h,fxq.c
fxq.c文件
#include "StdAfx.h"
#include "Windows.h"
#include "jni.h"
#include "fxq.h"
#include "FxqSys.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
printf("fxq.dll加载成功/n");
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
{
//theLog.Close();
Clearup();
printf("fxq.dll卸载成功/n");
}
break;
}
return TRUE;
}
JNIEXPORT jint JNICALL
Java_com_szkingdom_kssp_util_fxq_InitDLL
(
JNIEnv * jenv,
jclass jobj)
{
long iret = -1;
iret = Startup();
return iret;
}
JNIEXPORT jint JNICALL
Java_com_szkingdom_kssp_util_fxq_ProcessKY(JNIEnv*jenv,jobject jobj, jstring jbatchId)
{
long iret = -1;
const char *sBatchId = NULL;
//得到Java的string类中
//所包含的字符串指针
sBatchId=(*jenv)->GetStringUTFChars(jenv, jbatchId,0);
iret = ExportKeYiTradeXml(sBatchId);
(*jenv)->ReleaseStringUTFChars(jenv, jbatchId, sBatchId);
return iret;
}
JNIEXPORT jint JNICALL
Java_com_szkingdom_kssp_util_fxq_ProcessBig(JNIEnv*jenv, jobject jobj, jstring jbatchId)
{
long iret = -1;
const char *sBatchId = NULL;
sBatchId = (*jenv)->GetStringUTFChars(jenv,jbatchId, 0);
iret = ExportBigTradeXml(sBatchId);
(*jenv)->ReleaseStringUTFChars(jenv, jbatchId, sBatchId);
return iret;
}
JNIEXPORT jint JNICALL
Java_com_szkingdom_kssp_util_fxq_ReCreateKY(JNIEnv* jenv, jclass jobj, jstring jbatchId, jstring jFileName)
{
long iret = -1;
const char *sBatchId = NULL;
const char *sFileName = NULL;
sBatchId = (*jenv)->GetStringUTFChars(jenv,jbatchId, 0);
sFileName = (*jenv)->GetStringUTFChars(jenv,jFileName, 0);
iret = MakeKeYiReSendZip(sBatchId, sFileName);
(*jenv)->ReleaseStringUTFChars(jenv, jbatchId, sBatchId);
(*jenv)->ReleaseStringUTFChars(jenv, jFileName, sFileName);
return iret;
}
fxq.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class com_szkingdom_kssp_util_fxq */
#ifndef _Included_com_szkingdom_kssp_util_fxq
#define _Included_com_szkingdom_kssp_util_fxq
#ifdef __cplusplus
extern "C" {
#endif
/* Inaccessible static: init */
/*
* Class: com_szkingdom_kssp_util_fxq
* Method: InitDLL
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_szkingdom_kssp_util_fxq_InitDLL
(JNIEnv *, jclass);
/*
* Class: com_szkingdom_kssp_util_fxq
* Method: ProcessKY
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jint JNICALL Java_com_szkingdom_kssp_util_fxq_ProcessKY
(JNIEnv *, jclass, jstring);
/*
* Class: com_szkingdom_kssp_util_fxq
* Method: ProcessBig
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jint JNICALL Java_com_szkingdom_kssp_util_fxq_ProcessBig
(JNIEnv *, jclass, jstring);
/*
* Class: com_szkingdom_kssp_util_fxq
* Method: ReCreateKY
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jint JNICALL Java_com_szkingdom_kssp_util_fxq_ReCreateKY
(JNIEnv *, jclass, jstring, jstring);
/*
* Class: com_szkingdom_kssp_util_fxq
* Method: ReCreateBig
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jint JNICALL Java_com_szkingdom_kssp_util_fxq_ReCreateBig
(JNIEnv *, jclass, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
JNIEXPORT jint JNICALL
Java_com_szkingdom_kssp_util_fxq_ReCreateBig(JNIEnv* jenv, jclass jobj, jstring jbatchId, jstring jFileName)
{
long iret = -1;
const char *sBatchId = NULL;
const char *sFileName = NULL;
sBatchId = (*jenv)->GetStringUTFChars(jenv,jbatchId, 0);
sFileName = (*jenv)->GetStringUTFChars(jenv,jFileName, 0);
//iret = MakeKeBigSendZip(sBatchId, sFileName);
(*jenv)->ReleaseStringUTFChars(jenv, jbatchId, sBatchId);
(*jenv)->ReleaseStringUTFChars(jenv, jFileName, sFileName);
return iret;
}
注意:
1、在C++头文件中定义函数声明必须加上JAVA 包名,譬如上面的:com.szkingdom.kssp.util
- java调用c动态库
- Java调用c/c++动态链接库
- Java调用C/C++动态库so
- Java调用动态库
- Java动态库调用
- JAVA使用JNI调用C/C++动态库
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库
- Java调用C/C++编写的动态连接库-JNI
- linux下 java JNI调用C语言动态链接库
- java 调用C/C++ JNI 动态链接库
- JAVA使用JNI调用C/C++动态库
- java(JNI)调用c/c++动态链接库 linux
- Java和eclipse调用C开发动态链接库问题
- java借助于JNI调用c/c++动态链接库
- Java调用c程序动态库详细案例
- python 调用 C 动态库
- python3调用C动态库
- 推挽输出与开漏输出的区别
- 对CRITICAL_SECTION理解的总结
- 【转】智能设备项目:将程序生成CAB文件 并将CAB部署到PocketPC等仿真设备
- C#操作 Excel 详解
- 模板内部类型定义 typename::int
- java调用c++动态库
- InitializeCriticalSectionAndSpinCount()
- 表的连接
- Oracle 中的exception——(Raise)
- 收集SQLite中的时间日期函数
- Sql 递归查询
- [C++对象模型][2]指针与引用
- SQL研究-相似的数据类型
- Document 对象的常用方法