JNI中的有关函数参数的一个怪异问题

有一个JAVA层函数,如下:

private void postAudioDataFromNative(int clientId, int dataLen, byte[] dataBuffer,
          long presentTimeUs, String audioType) {
          ...
          }

JNI层处理如下:

 jmethodID audioMethodID = env->GetMethodID(g_objectClass, "postAudioDataFromNative", "(II[BJLjava/lang/String;)V");

调用JAVA层函数时

env->CallVoidMethod(g_object, audioMethodID, clientId, sumByte, jarrRV, presentationTimeUs, type);

这样组合使用后, 在JAVA函数中添加打印, String audioType 的值一直未null(但是在传入前,type值是正常的),而其他参数都是有值的, 且正常。

同样的代码,仅修改参数顺序, 代码变为如下:

JAVA层

private void postAudioDataFromNative(int clientId, int dataLen, byte[] dataBuffer,
          String audioType, long presentTimeUs) {
          ...
          }

JNI层

 jmethodID audioMethodID = env->GetMethodID(g_objectClass, "postAudioDataFromNative", "(II[BLjava/lang/String;J)V");

调用

env->CallVoidMethod(g_object, audioMethodID, clientId, sumByte, jarrRV, type, presentationTimeUs);

这样组合使用后, 在JAVA函数中添加打印,所有参数值都正常。

有哪位大神指导下,这是为什么? 不胜感激~~~
为什么String类型的参数必须在long型参数前, 而不能放在long型参数后。(测试int型,也是只能放在long型前, 如果放在long型后, 值总是0, 而不是传入的值(比如传入2, 但是总是获得0))

问题原因:

在论坛里一位大神恢复后, 按照大神的提示, 我检查了接口参数中的数据类型所占长度, 发现JAVA层和Native中所占长度不一样, 修改为一样长度, 即都是32位后, 该问题解决了。 看来是数据类型长度不对等, 造成后边的参数无法正常传递。

重要事情说三遍:
类型要匹配!!!
类型要匹配!!!
类型要匹配!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值