我现在有个功能需要调用dll。那位帮忙写一段代码好吗,在线等
其实功能很简单,我有一个已存在的sendrcv.dll,但不支持java直接调用
所以我就写了一个C++程序编译成支持java的sendrcv2java.dll
只有一个函数: String sendrcv(String in,String out)
java代码如下:public class MedicalInsurance {
    public MedicalInsurance() {
        super();
    }    static {
        System.loadLibrary("SendRcv2Java"); // 载入SendRcv.dll的动态连接
    }
 
    public static native int SendRcv(String msg,String retmsg);
}C++代码如下:(VC6.0)
#include "StdAfx.h"
#include "MedicalInsurance.h"JNIEXPORT jstring JNICALL Java_MedicalInsurance_SendRcv
(JNIEnv * env, jclass obj, jstring in, jstring out){

const char *inputData = env->GetStringUTFChars(in, 0); char * outputDat = new char[1000];
    char miwen[1000];
typedef char(__stdcall *FUN)(const char* inputData,char* outputDat);
HINSTANCE hDLL;
FUN SendRcv;
hDLL=LoadLibrary("C:\\WINDOWS\\system32\\SendRcv.dll");//加载动态链接库文件;
SendRcv=(FUN)GetProcAddress(hDLL,"SendRcv");
char re=SendRcv(inputData,outputDat);
    jstring result = env->newStringUTF(env,re);
strcpy(miwen,outputDat);
env->ReleaseStringUTFChars(out, miwen);
FreeLibrary(hDLL);//卸载.dll文件;
delete [] outputDat;
return result;
}红字的地方是有疑问处。主要是jstring类型不知道怎么处理。
那位帮忙指点一下啊

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【divxpaly】截止到2008-06-24 14:12:22的历史汇总数据(不包括此帖):
    发帖数:0                  发帖分:0                  
    结贴数:0                  结贴分:0                  
    未结数:0                  未结分:0                  
    结贴率:-------------------结分率:-------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    这一段是C代码,处理是有点复杂,建议使用jni开发包,你旧不用写这些代码了,直接调用在dll中的方法旧可以了,它自己会帮你进行转化。
      

  3.   

    什么开发包?我只知道jni编程的话只能这样做。
    如果能不用写c代码就能调用dll的话就更好了。
      

  4.   

    问题补充:当返回类型为jint时,这样写没有报错。代码如下JNIEXPORT jint JNICALL Java_MedicalInsurance_SendRcv
    (JNIEnv * env, jclass obj, jstring in, jstring out){
    const char *inputData = env->GetStringUTFChars(in, 0);
    char * outputDat = new char[1000];
            char miwen[1000];
    typedef int (__stdcall *FUN)(const char* inputData,char* outputDat);
    HINSTANCE hDLL;
    FUN SendRcv;
    hDLL=LoadLibrary("C:\\WINDOWS\\system32\\SendRcv.dll");//加载动态链接库文件;
    SendRcv=(FUN)GetProcAddress(hDLL,"SendRcv");
    int result=SendRcv(inputData,outputDat);
    strcpy(miwen,outputDat);
    env->ReleaseStringUTFChars(out, miwen);
    FreeLibrary(hDLL);//卸载.dll文件;
    delete [] outputDat;
    return result;
    }
    但我需要返回的不是jint,而是jstring。
      

  5.   

    public static native int SendRcv(String msg,String retmsg); typedef char(__stdcall *FUN)(const char* inputData,char* outputDat); 
    typedef int (__stdcall *FUN)(const char* inputData,char* outputDat); 1。首先要确定你的函数原型是哪个,似乎返回的都只是数字或char,如果这样的话,就没必要返回jstring了。
    你需要返回的数据应该是 jstring out? 还是什么啊?2。如果要返回jstring 可以env->newStringUTF(env, char*);或者其他newStringUTF重载方法3。或者可以使用https://jna.dev.java.net/
    JNA可以不写C代码就可以采访本地DLL 我没试过。。