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

原创粉丝点击