首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于一个JNI 参数传递的有关问题

2012-02-06 
关于一个JNI 参数传递的问题我有个问题请问下各位我现在有个vb的.dll文件,里面函数为closecomm(comm_value

关于一个JNI 参数传递的问题
我有个问题   请问下各位  
我现在有个vb的   .dll文件   ,里面函数为
closecomm(comm_value&   )
参数为   comm_value   的结构为

Public   Type   Comm_value  
com_port   As   String   *   3         //传入参数
dis_value   As   String   *   40     //传出参数  
data_len   As   String   *   2         //传出参数
End   Type

现在我使用jni的方法   重新用c++写个dll让java   调用

代码如下
main.h

class   comm_value{
  public:
      char   com_port[10];
      char   dis_value[40];
      char   data_len[2];

};

typedef   int   __stdcall   (*SendCard_c_mcom_set)(comm_value&   value);
typedef   int   __stdcall   (*SendCard_closecomm)(comm_value&   value);


main.cpp

JNIEXPORT   jint   JNICALL   Java_SendCardJava_c_1mcom_1set
    (JNIEnv   *   env,   jobject,   jobject   comm)
{
      jclass   commValueCls   =   env-> FindClass( "Comm_Value ");
      jfieldID   fid_CommValue_comport   =   env-> GetFieldID(commValueCls, "com_port ", "Ljava/lang/String; ");
      jobject   proCommport   =   env-> GetObjectField(comm,fid_CommValue_comport);
      jstring   ppCommPort   =   (jstring)env-> GetObjectField(proCommport,fid_CommValue_comport);

            HINSTANCE     DLLHandle;
            SendCard_c_mcom_set   sc_c_mcom_set;
            int   open_result   =   0;

            DLLHandle   =   LoadLibrary( "D:\\DGD4V3.0\\sendcard.dll ");     //

            if   (DLLHandle)   //call   crmp   timeout   hook
            {
                    try
                  {
                      sc_c_mcom_set   =   (SendCard_c_mcom_set)GetProcAddress(DLLHandle, "c_mcom_set ");
                      if   (sc_c_mcom_set)
                      {
                            -----------------------------------------
                            问题:   下面的我调用vb   的dll   中的函数   c_mcom_set   (Comm_value     &   parameter   )   parameter   参数应该如何转换成Comm_value   类
                                并使引用中的传出的2个参数怎样传出   希望大家能帮帮忙   谢谢~
                            open_result   =   sc_c_mcom_set(commValueCls);
                           
                      }


                      }catch(...)
                      {
                  }
            }
}

[解决办法]
对不起,因为我不会用c/C++, 所以没做过JNI的调用,不过你可以去google搜索一下哦!这个应该不是很麻烦的!

native class 之类的
native myMethod() 之类的

总之,书写一个类或者一个方法为native ,
[解决办法]
不妨把一个参数comm_value拆成三个string作为三个参数,再试试。
在java代码中增加print语句,进行诊断。
这个调用应该不麻烦。
[解决办法]
试问一下,你在前边comportStr,有内容吗?
const char* comportStr =(char*) env-> GetStringChars(ppCommPort,0); 

........ 

print出来试试。

[解决办法]
comportStr为空,是导致后边出错的根本原因。
你看看const jchar * GetStringChars(JNIEnv *env, jstring string,
jboolean *isCopy); 

返回的是jchar*, 它是unicode char*啊。相当于是short*
你得把它们转换成gbk串才行。
[解决办法]
这样吧,不要使用GetStringChars,改调用:
int len = env->GetStringUTFLength(ppCommPort); 

char* comportStr = env->GetStringUTFChars(name, iscopy)
看它里边有没有内容,这个是utf-8编码的,如果是ansi char,不会有什么问题。如果是中文,则要转到gbk,才能显示。




[解决办法]

探讨
谢谢各位了,是这样的, 我有个D4 读卡器 需要发指令才能读 写数据的,所以 我想利用已经有的dll 再封装个dll 再用java调用 .现在在 执行jclass commValueCls = env-> FindClass("Comm_value"); 时就报错了,但我java里面已经定义了Comm_value这个类的
public class Comm_value {
public String com_port;

public String dis_value;

public String data_len;
}

请高手们多给点意见


[解决办法]
哈哈哈,小子你碰上我,算你命好,给你看段代码.
jstring 装的是UNICODE的字符,你要把它转成ASCII

JNIEXPORT jint JNICALL Java_DllConvert_TScan_selectSource
(JNIEnv *env, jobject, jstring sSrcName)
{
int nLen = env->GetStringLength(sSrcName) * 2 + 1;
char *pcName = new char[nLen];
memset( pcName, 0, nLen );

const wchar_t* w_buffer = env->GetStringChars( sSrcName, 0 );
nLen = WideCharToMultiByte(CP_ACP, 0, 
w_buffer, wcslen(w_buffer) + 1, pcName, nLen, NULL, NULL);

//上面几行就是把jstring 类型转为char*

int nRes = TSCAN_SelectSource(pcName); //这是我的函数.

env->ReleaseStringChars(sSrcName, w_buffer); //用完了要释放,但不释放好象也行,似乎没有内存泄露,呵呵不清楚.
delete pcName;
return nRes;
}
[解决办法]
unsigned short* 和wchar_t*不是一回事吗?
typedef unsigned short wchar_t; //这事它的宏定义.

热点排行