如何在java中調(diào)用Dll,考試大提示寫的程序出了一些問題。問題如下:
用VC做了一個Image.dll
用java調(diào)用
public class kk
{
static
{
System.loadLibrary("Image");
}
public kk()
{
}
private native void OnBtnOpenFile(char [] ll);
public void text()
{
String kk="d:\\1.bmp";
char[] mm=kk.toCharArray();
OnBtnOpenFile(mm);
}
public static void main(String[] argo )
{
kk k=new kk();
k.text();
}
}
為什么出現(xiàn)noclassdeffounderror的異常
DLL放在C:\Program Files\Java\jre1.6.0\bin目錄下
有什么問題如何解決
看了以上問題描述之后,java訪問Essbase,訪問ibm olap Server,訪問ms SqlServer2000 Analysis Service,訪問orale express,針對此問題的解決方式如下:
1、在java中調(diào)用用C/C++寫的dll需要使用JNI編程。具體如下:
2、先定義好帶有 private native void OnBtnOpenFile(char [] ll); 聲明的java類,然后用javah.exe生成VC的頭文件kk_***.h;
3、然后再在VC項(xiàng)目中引用kk_***.h,撰寫kk_***.cpp,提供方法的實(shí)現(xiàn)代碼;
4、編譯后,dll放在system32之下,因?yàn)镴NI是按照Windows dll方式尋找的,不是classpath下,也不是系統(tǒng)的path中;
5、源碼中,特意將String轉(zhuǎn)換為Char[],其實(shí)在這里是不必要的;
6、原來所做的string、char[]轉(zhuǎn)換,應(yīng)該在cpp實(shí)現(xiàn)中,進(jìn)入cpp方法之前作jstring->char*轉(zhuǎn)換,返回java之前作char*->jstring轉(zhuǎn)換;
7、jstring->char*的轉(zhuǎn)換如下:
char *jstringToWindows(JNIEnv* env, jstring jstr)
{
jclass jst=env->FindClass("java/lang/String");
jmethodID jmd = env ->GetMethodID(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 < len; i++)
rtn[i] = bytes[i];
rtn[len] = '\0';
env->DeleteLocalRef(jbary);
return (char *)rtn;
}
8、char*->jstring的轉(zhuǎn)換如下:
jstring WindowsTojstring( JNIEnv* env, char* str)
{
int len=strlen(str);
jbyteArray jbay = env->NewByteArray(len);
env->SetByteArrayRegion(jbay, 0, len, (jbyte *)str);
jclass jst=env->FindClass("java/lang/String");
jmethodID jmd = env ->GetMethodID(jst, " ", "([B)V");
return (jstring)env->NewObject(jst, jmd, jbay);
}
用VC做了一個Image.dll
用java調(diào)用
public class kk
{
static
{
System.loadLibrary("Image");
}
public kk()
{
}
private native void OnBtnOpenFile(char [] ll);
public void text()
{
String kk="d:\\1.bmp";
char[] mm=kk.toCharArray();
OnBtnOpenFile(mm);
}
public static void main(String[] argo )
{
kk k=new kk();
k.text();
}
}
為什么出現(xiàn)noclassdeffounderror的異常
DLL放在C:\Program Files\Java\jre1.6.0\bin目錄下
有什么問題如何解決
看了以上問題描述之后,java訪問Essbase,訪問ibm olap Server,訪問ms SqlServer2000 Analysis Service,訪問orale express,針對此問題的解決方式如下:
1、在java中調(diào)用用C/C++寫的dll需要使用JNI編程。具體如下:
2、先定義好帶有 private native void OnBtnOpenFile(char [] ll); 聲明的java類,然后用javah.exe生成VC的頭文件kk_***.h;
3、然后再在VC項(xiàng)目中引用kk_***.h,撰寫kk_***.cpp,提供方法的實(shí)現(xiàn)代碼;
4、編譯后,dll放在system32之下,因?yàn)镴NI是按照Windows dll方式尋找的,不是classpath下,也不是系統(tǒng)的path中;
5、源碼中,特意將String轉(zhuǎn)換為Char[],其實(shí)在這里是不必要的;
6、原來所做的string、char[]轉(zhuǎn)換,應(yīng)該在cpp實(shí)現(xiàn)中,進(jìn)入cpp方法之前作jstring->char*轉(zhuǎn)換,返回java之前作char*->jstring轉(zhuǎn)換;
7、jstring->char*的轉(zhuǎn)換如下:
char *jstringToWindows(JNIEnv* env, jstring jstr)
{
jclass jst=env->FindClass("java/lang/String");
jmethodID jmd = env ->GetMethodID(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 < len; i++)
rtn[i] = bytes[i];
rtn[len] = '\0';
env->DeleteLocalRef(jbary);
return (char *)rtn;
}
8、char*->jstring的轉(zhuǎn)換如下:
jstring WindowsTojstring( JNIEnv* env, char* str)
{
int len=strlen(str);
jbyteArray jbay = env->NewByteArray(len);
env->SetByteArrayRegion(jbay, 0, len, (jbyte *)str);
jclass jst=env->FindClass("java/lang/String");
jmethodID jmd = env ->GetMethodID(jst, " ", "([B)V");
return (jstring)env->NewObject(jst, jmd, jbay);
}

