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

昨天在从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


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值