当前位置: 代码迷 >> J2SE >> 怎么使用JAVA调用C++编写的Dll函数,Char *指针
  详细解决方案

怎么使用JAVA调用C++编写的Dll函数,Char *指针

热度:4474   发布时间:2013-02-25 00:00:00.0
如何使用JAVA调用C++编写的Dll函数,Char *指针
厂家的DLL函数的原型:

char * GetErrMsgA(void);
int GetMyID(char *myid);
我的思路是这样的:使用Swig,JNI对厂家的dll进行封装,然后用Vc 6.0编译产生Java可以直接使用的dll(Test.dll),最后在JAVA里调用厂家DLL里面的函数。当函数有Char * 类型的参数,遇到了问题

JAVA中的代码:
  System.loadLibrary("Test"); //Test.dll就是新编译产生的dll
   
  String ErrMsg = "###";
  ErrMsg = Test.GetErrMsgA();
  System.out.println(ErrMsg); //这个正常,可以打印出dll返回的ErrMsg数据
   
  String MyID = "***";
  Test.GetMyID(MyID);
  System.out.println(MyID); //这个地方就出问题了,一直打印的是"***";
   
   
现在可以肯定,已经成功调用厂家动态库里面的GetMyID函数,并且在厂家他们自己的日志里也能看到对应的记录和MyID,问题在于JAVA获取不到这个MyID,如何解决?
测试了其它dll里的函数,如果有参数是Char *类型,都有这个问题,如果函数返回值是Char *,那一切正常。

刚开始使用JAVA,不是很熟,请指点

------解决方案--------------------------------------------------------
java里面String是不可变的。所以把String传入再改变值是不允许的。
jstring 是 jobject
C/C++ code
#define CHECK_EXCEPTION if((*env)->ExceptionCheck(env) == JNI_TRUE) returnint GetMyID(char *myid){    char* arr = "098abc";    while (*arr)    {        *(myid++) = *(arr++);    }    *myid = 0;}JNIEXPORT jint JNICALL Java_JNITest_GetMyID(JNIEnv *env, jobject this, jobject buff){    JNIEnv _env = *env;    jint len = _env->GetArrayLength(env, buff);    CHECK_EXCEPTION 0;    jbyte p[len];    int r = GetMyID(p);    if (!r)    {        _env->SetByteArrayRegion(env, buff, 0, len, p);        CHECK_EXCEPTION 0;    }    return r;}
  相关解决方案