关于一个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,才能显示。
[解决办法]
[解决办法]
哈哈哈,小子你碰上我,算你命好,给你看段代码.
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; //这事它的宏定义.