开发者社区> 问答> 正文

jni循环调用java接口发生崩溃:报错

C本地接口

JNIEnv* jniEnv = NULL;
jclass TestProvider = NULL;
jobject mTestProvider = NULL;

void CtoJavaInit(void){

   TestProvider = (*jniEnv)->FindClass(jniEnv,"com/example/jni/C2jni");
   if(NULL == TestProvider)return 2;
   jmethodID construction_id = (*jniEnv)->GetMethodID(jniEnv, TestProvider, "<init>", "()V");
   if(0 == construction_id)return 3;
   mTestProvider = (*jniEnv)->NewObject(jniEnv, TestProvider, construction_id);
   if(NULL == mTestProvider)return 4;

   SendJ = (*jniEnv)->GetMethodID(jniEnv, TestProvider, "javaSend","([BI)I");
   if(NULL == obdSendJ)return 5;
  return 0;

}

int cSend(char *data, int datalen){
int len,intresult;
jbyteArray bytes;

if(NULL == jniEnv || NULL == mTestProvider || NULL == obdSendJ)return 0;
if(NULL == data || datalen > 128)return 0;
bytes = (*jniEnv)->NewByteArray(jniEnv, datalen);
if(NULL == bytes)return 0;
(*jniEnv)->SetByteArrayRegion(jniEnv, bytes, 0, datalen, (const jbyte *)data);
(*jniEnv)->CallIntMethod(jniEnv, mTestProvider, obdSendJ, bytes, datalen);
(*jniEnv)->DeleteLocalRef(jniEnv, bytes);
return datalen;
}

JNIEXPORT void JNICALL 

 Java_nativeMethod(JNIEnv *env, jobject obj){

   char *sendtest = "test..."; 

   jniEnv = env;

   CtoJavaInit();

   cSend(sendtest, strlen(sendtest);

}

说明:

JAVA代码循环调用nativeMethod接口,nativeMethod则通过cSend将一串数据发送到java的javaSend接口

问题是:循环发送N次后(200次左右)(*jniEnv)->CallIntMethod(jniEnv, mTestProvider, obdSendJ, bytes, datalen);出现崩溃

也做过以下测试:

nativeMethod接口中做如下修改

 char *sendtest = "test..."; 

   jniEnv = env;

   if(nativeMethod_firstcall == 1)CtoJavaInit();  //只在首次调用nativeMethod才进行接口初始化

   cSend(sendtest, strlen(sendtest);

但结果是软件更快崩溃

也试过在每次nativeMethod返回时释放mTestProvider,但依然没有效果

请大牛们指点 ...

展开
收起
kun坤 2020-06-14 10:34:54 2166 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载