那是你的c语言代码啊。用一个c的class包装JNI,在这里调用其他的c的class。操作结果回传java

解决方案 »

  1.   

    传递一个c的指针到java中有用吗
      

  2.   

    当然有用不过有办法,比如我现在要写一个RandomAccessFile随机读取文件的Class。每个Class的实例需要指到一个文件指针上去。如果同时创建多个实例A,B,C分别读些三个文件AA,BB,CC,那么会同时打开三个文件。在C程序中执行时需要知道文件的指针吧。
    不过现在问题已经解决了。
    就是在DLL静态初始化一个数组(链表自然也可以了)每打开一个文件(实例化一个Class)在这个数组里作标识,然后就把这个标识返回Java。执行时读取当前class的标识指到正确的文件指针进行文件操作。
    现在麻烦的时无论如何都都没法把这个标识写回java.请大家看看我的代码:
    JNIEXPORT void JNICALL Java_CoreIOAccess_open
    (JNIEnv * env, jobject jo, jstring fileName, jboolean writeable)
    {
             .................................
    newStream = fopen(name,openMode);
    jclass cl = env->GetObjectClass(jo);
             //这里找到并准备调用setOnlyFileId方法写一个ID号到java 
    jmethodID setFileId = env->GetMethodID(cl,"setOnlyFileId","(J)V");
    jvalue params[1];
    //直接把指针地址写过去,在执行时通过判断地址执行相应文件操作 
    params[0].j = (jlong)newStream;
    stm = newStream;
             //执行有问题
    env->CallVoidMethod(jo,setFileId,params);
             .................................
        这里无论我给什么执行的都是同一个东西,比如我给params[0].j为1或1234567或任何值最后的ID始终是一个不变的奇怪值比如1567356654322.后来被迫在setOnlyFileId(里再次调用一个native method返回了当前打开的file stream指针才成功,缺点就是这个必须在刚刚打开时执行,就是在class初始化,open file代码里执行,)