C++技巧(JNI編程的大致步驟)

字號:

如何在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);
    }