遇上一个头疼的问题 ReferenceTable overflow (max=1024)

Android 码拜 4年前 (2016-09-22) 489次浏览
先上源码
库是aes加解密的,通过swig来自动生成的接口
这个是wrap.cpp中的接口
SWIGEXPORT jint JNICALL Java_org_pjsip_pjsua_pjsuaJNI_do_1aes_1encode(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jbyteArray jarg3, jint jarg4, jbyteArray jarg5, jintArray jarg6) {
jint jresult = 0 ;
unsigned char *arg1 = (unsigned char *) 0 ;
int arg2 ;
unsigned char *arg3 = (unsigned char *) 0 ;
int arg4 ;
unsigned char *arg5 = (unsigned char *) 0 ;
int *arg6 = (int *) 0 ;
int result;

(void)jenv;
(void)jcls;
{
long receivedLength = jenv->GetArrayLength(jarg1);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg1 = (unsigned char *) jenv->GetByteArrayElements(jarg1, 0);
}
arg2 = (int)jarg2;
{
long receivedLength = jenv->GetArrayLength(jarg3);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg3 = (unsigned char *) jenv->GetByteArrayElements(jarg3, 0);
}
arg4 = (int)jarg4;
{
long receivedLength = jenv->GetArrayLength(jarg5);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg5 = (unsigned char *) jenv->GetByteArrayElements(jarg5, 0);
}
{
long receivedLength = jenv->GetArrayLength(jarg6);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg6 = (int *) jenv->GetIntArrayElements(jarg6, 0);
}
result = (int)do_aes_encode(arg1,arg2,arg3,arg4,arg5,arg6);
jresult = (jint)result;
{
// Allow the Java byte array to be garbage collected.
if(arg1)
jenv->ReleaseByteArrayElements(jarg1, (jbyte *) arg1, JNI_COMMIT); // JNI_ABORT = Don”t alter the original array.
}
{
// Allow the Java byte array to be garbage collected.
if(arg3)
jenv->ReleaseByteArrayElements(jarg3, (jbyte *) arg3, JNI_COMMIT); // JNI_ABORT = Don”t alter the original array.
}
{
// Allow the Java byte array to be garbage collected.
if(arg5)
jenv->ReleaseByteArrayElements(jarg5, (jbyte *) arg5, JNI_COMMIT); // JNI_ABORT = Don”t alter the original array.
}
{
// Allow the Java byte array to be garbage collected.
if(arg6)
jenv->ReleaseIntArrayElements(jarg6, (jint *) arg6, JNI_COMMIT); // JNI_ABORT = Don”t alter the original array.
}
return jresult;
}
SWIGEXPORT jint JNICALL Java_org_pjsip_pjsua_pjsuaJNI_do_1aes_1decode(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jbyteArray jarg3, jint jarg4, jbyteArray jarg5, jintArray jarg6) {
jint jresult = 0 ;
unsigned char *arg1 = (unsigned char *) 0 ;
int arg2 ;
unsigned char *arg3 = (unsigned char *) 0 ;
int arg4 ;
unsigned char *arg5 = (unsigned char *) 0 ;
int *arg6 = (int *) 0 ;
int result;

(void)jenv;
(void)jcls;
{
long receivedLength = jenv->GetArrayLength(jarg1);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg1 = (unsigned char *) jenv->GetByteArrayElements(jarg1, 0);
}
arg2 = (int)jarg2;
{
long receivedLength = jenv->GetArrayLength(jarg3);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg3 = (unsigned char *) jenv->GetByteArrayElements(jarg3, 0);
}
arg4 = (int)jarg4;
{
long receivedLength = jenv->GetArrayLength(jarg5);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg5 = (unsigned char *) jenv->GetByteArrayElements(jarg5, 0);
}
{
long receivedLength = jenv->GetArrayLength(jarg6);

if (receivedLength ==0 )
{
jclass excep = jenv->FindClass(“java/lang/Exception”);
if (excep)
jenv->ThrowNew(excep, “input data length is error”);
}

arg6 = (int *) jenv->GetIntArrayElements(jarg6, 0);
}
result = (int)do_aes_decode(arg1,arg2,arg3,arg4,arg5,arg6);
jresult = (jint)result;
{
// Allow the Java byte array to be garbage collected.
if(arg1)
jenv->ReleaseByteArrayElements(jarg1, (jbyte *) arg1, JNI_COMMIT);
}
{
// Allow the Java byte array to be garbage collected.
if(arg3)
jenv->ReleaseByteArrayElements(jarg3, (jbyte *) arg3, JNI_COMMIT);
}
{
// Allow the Java byte array to be garbage collected.
if(arg5)
jenv->ReleaseByteArrayElements(jarg5, (jbyte *) arg5, JNI_COMMIT);
}
{
// Allow the Java byte array to be garbage collected.
if(arg6)
jenv->ReleaseIntArrayElements(jarg6, (jint *) arg6, JNI_COMMIT);
}
return jresult;
}
5.0上就好好的,4.4.2上就会报ReferenceTable overflow  1024
根据一般的报这个错的都是原因是没有Release*ArrayElements。
而且5.0下可以,4.4.2下就不行了

解决方案

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明遇上一个头疼的问题 ReferenceTable overflow (max=1024)
喜欢 (0)
[1034331897@qq.com]
分享 (0)