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;
}
誰能給我一些想法?如何解決這個錯誤。謝謝。
你的JNI方法簽名不匹配。 –
jni代碼塊在哪裏簽名不匹配? – Mark