C++技巧(JNI编程的大致步骤)

C++技巧(JNI编程的大致步骤),第1张

C++技巧(JNI编程的大致步骤),第2张

java中如何调用Dll?考试提示里写的程序有些问题。问题如下:
在VC中做了一个image.dll
在java中调用了
公共类KK
static
{
system . loadlibrary(" image ");
}
public kk()
{
}
private native void onbtn openfile(char[]ll);
public void text()
{
String kk = " d:\ \ 1 . BMP ";
char[]mm = kk . tochararray();
onbtopenfile(mm);
}
public static void main(String[]Argo)
{
kkk = new kk();
k . text();
}
}
noclassdeffounderror
DLL的异常为什么放在C:\ Program Files \ Java \ JRE 1 . 6 . 0 \ bin目录下
有什么问题,如何解决
看上面。访问java Essbase、ibm olap Server、ms SqlServer2000分析服务和orale express。解决这个问题的方法如下:
1。用java调用C/C++编写的dll需要JNI编程。具体如下:
2。首先用private native void定义onbtopenfile(char[]ll);声明java类,然后用javah.exe生成头文件kk_***。VC的h;
3。然后参考kk_***。h在VC项目中,写kk_***。cpp,并提供方法的实现代码;
4。编译后dll放在system32下,因为JNI是根据Windows dll搜索的,不是在classpath下,也不是在系统的路径下;
5。在源代码中,String被专门转换成Char[],这里其实没必要;
6。在cpp实现中,原string和char[]转换在进入cpp方法之前应该是jstring->char*转换,在返回java之前应该是char*->jstring转换;
7。jstring->char*的转换如下:
char * jstring windows(jnienv * env,jstring jstr)
{
jclassjst = env-> find class(" Java/lang/string
jmethodID jmd = env-> get method id(jst," getBytes ","()[B ");
jbyteArray jbary =(jbyteArray)env-> CallObjectMethod(jstr,jmd);
int len = env-> GetArrayLength(jbary);
jbyte * bytes = env-> GetByteArrayElements(jbary,0);
jbyte * RTN = new jbyte[len+1];
for(int I = 0;i < leni++)
RTN[I]= bytes[I];
RTN[len]= ' \ 0 ';
env-> DeleteLocalRef(jbary);
return(char *)RTN;
}
8、char *--> jstring的转换如下:
jstring windowstojstring(jnienv * env,char * str)
{
intlen = strlen(str);
jbyteArray jbay = env-> NewByteArray(len);
env-> SetByteArrayRegion(jbay,0,len,(jbyte *)str);
jclass jst = env-> find class(" Java/lang/String ");
jmethodID jmd = env-> get method id(jst," ","([B)V));
return(jstring)env-> new object(jst,jmd,jbay);
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++技巧(JNI编程的大致步骤)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情