昨天在从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 */
#else
typedef 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