首先我觉得你应该知道jni的基本使用步骤
我们调用本地方法是调用dll文件实现的,但是顺序只能是在java里面定义本地方法,然后编译,再用javah生成c或者c++的头文件,然后再根据头文件写相应的c和c++的方法。
再看看你的需求,我想只能通过自己再写一个dll来调用已有的那个dll至于类型转换,那很简单,java和c的基本数据类型都有对应转换

解决方案 »

  1.   

    To: jFresH_MaN()(AbsolutelyFresh)(java欣人) 
    我想确认的问题是:我要调用的c++的dll中函数的接口是这样定义的:
    void Read(char* strPath, short* strKey)
    我在java中声明本地接口的时候,函数的参数类型应该和C++中的相对应,我是象下面这样定义的,不知道对不对?
    public native void Read(char Path[],short key[]);另外,我知道要生成一个jni的dll.在这个dll中的方法中,去调用C++中的接口,已经生成了java.h文件,现在根据头文件写c++的方法时候,(如果上面的声明方法对的话)
    JNIEXPORT void JNICALL Java_qrcode_Code_Read
      (JNIEnv *, jobject obj, jcharArray Path, jshortArray key)
    {
        //问题是我怎样将Path和Word进行数据类型转换,去调用C++中的Read方法呢?
       Read(Path,Word)
    }
      

  2.   

    对于数组型参数,
    Java C/C++ 
    boolean[ ] JbooleanArray 
    byte[ ] JbyteArray 
    char[ ] JcharArray 
    short[ ] JshortArray 
    int[ ] JintArray 
    long[ ] JlongArray 
    float[ ] JfloatArray 
    double[ ] JdoubleArray 
    对于上述类型数组,有一组函数与其对应。以下函数中Xxx为对应类型。
    xxx * GetXxxArrayElements(xxxArray array, jboolean *isCopy)
    产生一个指向Java数组元素的C指针。不再需要时,需将此指针传给ReleaseXxxArrayElemes。参数:array 数组对象
          isCopy 如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。
    例如: jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) 
    void ReleaseXxxArrayElements(xxxArray array,xxx *elems, jint mode)
    通知虚拟机不再需要从GetXxxArrayElements得到的指针。参数:array 数组对象
          elems 不再需要的指向数组元素的指针
          mode 0=在更新数组元素后释放elems缓冲器
    JNI_COMMIT=在更新数组元素后不释放elems缓冲器
    JNI_ABORT=不更新数组元素释放elems缓冲器
    例如:void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems,     jint mode)
    xxxArray NewXxxArray(jsize len)
    产生一个新的数组,通常在反值类型为数组型时用到参数:len 数组中元素的个数。
    例如:jbooleanArray NewBooleanArray(jsize len)
      

  3.   

    我想确定的是象我这样声明对不对啊?????(能否与c++中的接口方法保持一致?)
    public native void Read(char Path[],short key[]);    =========java
    void Read(char* strPath, short* strKey) ===================c++
      

  4.   

    呵呵,可以的
    JNIEXPORT void JNICALL Java_qrcode_Code_Read
      (JNIEnv *, jobject obj, jcharArray Path, jshortArray key)
    {
        //问题是我怎样将Path和Word进行数据类型转换,去调用C++中的Read方法呢?
       Read(Path,Word)
    }
    这样用肯定可以