小弟初识jni,要用一个c的dll库,其中一个函数接口为:
char Login(struct Login_data * Login_result);
struct Login_data
{
char server[40];
char username[24];
char passwd[16];
}
要在java中调用,不知道怎么搞,我想在java中结构体直接写成类:
public class Login_Data
{
public char server[]= new char[40];
public char username[]= new char[24];
public char passwd[] = new char[16];
}
我想有两种方法:
1.直接把java的类传给dll:
private native char login(Login_Data loginData);但是我觉得这应该不行
2.写一个中间的dll来调用提供login(char* server,char* username,char* passwd),但是不知道怎么申明这个native函数,private native char login(a,b,c);并且a,b,c要带回一些值.
谢谢各位,不知道有没有做过类似的朋友,交流一下,望不吝赐教啊!

解决方案 »

  1.   

    在dll里面加一个函数不可以吗?
    login(char* server,char* username,char* passwd)
      

  2.   

    可以啊,但是java里面怎么申明
    private native char login(char *server...);?
    刚才写了下 char* server好像不行啊
      

  3.   

    可以使用jcharArray类型,贴个好东西给你看对于数组型参数,
    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不再需要的指向数组元素的指针
          mode0=在更新数组元素后释放elems缓冲器
    JNI_COMMIT=在更新数组元素后不释放elems缓冲器
    JNI_ABORT=不更新数组元素释放elems缓冲器
    例如:void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems,     jint mode)
    xxxArray NewXxxArray(jsize len)
    产生一个新的数组,通常在反值类型为数组型时用到参数:len数组中元素的个数。
    例如:jbooleanArray NewBooleanArray(jsize len)
      

  4.   

    这样没必要写一个单独的类来和这个struct对应!
    你在java中声明一个native方法,在这个类用javah生成的头文件中对应的函数,在你写的中间dll文件中改函数中调用你那个login函数不就行了!eg:
    native方法:public native void login1(String str); 
    生成的头文件中对应的函数为:JNIEXPORT void JNICALL Java_class_login1(JNIEnv *, jobject, jstring);
    在中间dll文件中实现Java_class_login1(JNIEnv *, jobject, jstring);这个函数,在这个函数中直接调用char Login(struct Login_data * Login_result);
    不行么?
      

  5.   

    是的,用三个String也是可以的
    对方接受的是jstring类型
    然后可以很方便地转成char*[]
      

  6.   

    private native char login(JcharArray server,JcharArray username,JcharArray passwd);?
    然后在自己写的dll中
    char* GetXxxArrayElements(charArray array, jboolean *isCopy)得到char指针,填写信息,这里isCopy是设置成JNI_FALSE还是JNI_TRUE呢?我个人决的事JNI_TRUE,因为是用完释放的时候是释放指针的副本吧?
      

  7.   

    to:  zhutouzip(Speak out!-shyboy) ( ) 
    你的意思是在中间的dll中对string进行分拆,对不对?
    但是这个只是其中的一个struct,还有很多其他的,并且其组成元素类型不相同
      

  8.   

    对了,如果是long类型的怎么让它去的返回值?这些struct中主要是long,char[],以及char类型
      

  9.   

    error LNK2001: unresolved external symbol _GetCharArrayElements
    晕!