Android开发Java中long型在JNI中类型的对应

来源:互联网 发布:知乎 这也能膜 编辑:程序博客网 时间:2024/06/18 07:50

昨天在从JAVA层往JNI传值得时候出现一个错误,这是一个将JAVA中的一个long型传到JNI的过程:

```

JNI WARNING: JNI method called with exception pending in Lcom/attop/h264/main/H264PlayAty;.startRecDownload:(Ljava/lang/Object;Ljava/lang/String;)V (GetFieldID)

java.lang.NoSuchFieldError: no field with name='mStartTime' signature='L' in class Lcom/attop/h264/interfaces/RemoteVideo;

```

因为之前在传值得时候遇到的都是int,string类型的数据,就直接用以下方式都OK:

jfieldID jfidChan = (*env)->GetFieldID(env, class, "mChanID", "I");

但是今天在传long型的时候用:

jfieldID jfidStartTime = (*env)->GetFieldID(env, class, "mStartTime", "L");

最后才发现java中的long类型在JNI中的signature根本就不是"L",而是“J”。而L是什么呢,是fully-qualified-class(全限定的类),用法如String类型一般:Ljava/lang/String;。

特此记录一下,附jni.h中的关于jvalue定义以及Java数据在JNI中的对应。

typedef union jvalue {    jboolean    z;    jbyte       b;    jchar       c;    jshort      s;    jint        i;    jlong       j;    jfloat      f;    jdouble     d;    jobject     l;} jvalue;

/* * Primitive types that match up with Java equivalents. */#ifdef HAVE_INTTYPES_H# include <inttypes.h>      /* C99 */typedef uint8_t         jboolean;       /* unsigned 8 bits */typedef int8_t          jbyte;          /* signed 8 bits */typedef uint16_t        jchar;          /* unsigned 16 bits */typedef int16_t         jshort;         /* signed 16 bits */typedef int32_t         jint;           /* signed 32 bits */typedef int64_t         jlong;          /* signed 64 bits */typedef float           jfloat;         /* 32-bit IEEE 754 */typedef double          jdouble;        /* 64-bit IEEE 754 */#elsetypedef unsigned char   jboolean;       /* unsigned 8 bits */typedef signed char     jbyte;          /* signed 8 bits */typedef unsigned short  jchar;          /* unsigned 16 bits */typedef short           jshort;         /* signed 16 bits */typedef int             jint;           /* signed 32 bits */typedef long long       jlong;          /* signed 64 bits */typedef float           jfloat;         /* 32-bit IEEE 754 */typedef double          jdouble;        /* 64-bit IEEE 754 */#endif


0 0