2015-09-21 51 views
1

我使用JNI調用c函數以創建接口。 我收到以下錯誤消息在Android工作室Java泛型 - 不兼容類型必需:java.io.filedescriptor發現:java.lang.object

不兼容的類型
要求:java.io.FileDescriptor中
發現:java.lang.Object繼承

packet.java

FileDescriptor myDev= null; 
myDev = JNI.prepare_fd("/dev/net/tun", myDev); =>this line hava above error 
in2 = new FileInputStream(myDev); 

JNI。 java

public class JNI { 
      static { 
        System.loadLibrary("JNITest"); 
      } 
      public static native Object prepare_fd(String filename, FileDescriptor fdobj); 
    } 

packet_JNI.h

JNIEXPORT jobject JNICALL Java_com_example_packetcapture_JNI_prepare_fd (JNIEnv *, jclass, jstring); 

JNITest.c

JNIEXPORT jobject JNICALL 
    Java_com_example_packetcapture_JNI_prepare_1fd(JNIEnv *env, jclass _ignore, jstring filename) 
    { 
    jfieldID field_fd; 
    jmethodID const_fdesc; 
    jclass class_fdesc, class_ioex; 
    jobject ret; 
    int fd; 
    char *fname; 

    class_ioex = (*env)->FindClass(env, "java/io/IOException"); 
    if (class_ioex == NULL) return NULL; 
    class_fdesc = (*env)->FindClass(env, "java/io/FileDescriptor"); 
    if (class_fdesc == NULL) return NULL; 

    fname = (*env)->GetStringUTFChars(env, filename, NULL); 

    fd = open(fname, O_RDWR | O_NONBLOCK); 

    (*env)->ReleaseStringUTFChars(env, filename, fname); 

    if (fd < 0) { 
     // open returned an error. Throw an IOException with the error string 
     char buf[1024]; 
     sprintf(buf, "open: %s", strerror(errno)); 
     (*env)->ThrowNew(env, class_ioex, buf); 
     return NULL; 
    } 

    // construct a new FileDescriptor 
    const_fdesc = (*env)->GetMethodID(env, class_fdesc, "<init>", "()V"); 
    if (const_fdesc == NULL) return NULL; 
    ret = (*env)->NewObject(env, class_fdesc, const_fdesc); 

    // poke the "fd" field with the file descriptor 
    field_fd = (*env)->GetFieldID(env, class_fdesc, "fd", "I"); 
    if (field_fd == NULL) return NULL; 
    (*env)->SetIntField(env, ret, field_fd, fd); 

    // and return it 
    return ret; 
    } 

誰能給我一些想法?如何解決這個錯誤。謝謝。

+0

你的JNI方法簽名不匹配。 –

+0

jni代碼塊在哪裏簽名不匹配? – Mark

回答

0

以下行說,這是一個通用的對象類型:

public static native Object prepare_fd(String filename, FileDescriptor fdobj); 

最簡單的解決是設置mydev的時候把它轉換爲文件描述符:

myDev = (filedescriptor) JNI.prepare_fd("/dev/net/tun", myDev); 
+0

當我添加filedescriptor時,它可以編譯,謝謝 – Mark