有一个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位后, 该问题解决了。 看来是数据类型长度不对等, 造成后边的参数无法正常传递。
重要事情说三遍:
类型要匹配!!!
类型要匹配!!!
类型要匹配!!!