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

发布于 2021-11-18 20:15:41 字数 2323 浏览 839 评论 14

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,但依然没有效果

请大牛们指点 ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

恋你朝朝暮暮 2021-11-24 00:35:33

引用来自“fcsong000833”的答案

引用来自“南湖船老大”的答案

建议去iteye的高级语言虚拟机群问问

好听的两个字的网名 2021-11-24 00:35:33

什么错误?

顾忌 2021-11-24 00:35:33

宏哥来给你终极解决方案吧

需要和C集成的地方, 用python.  

python可以暴露web借口给 java。 其实lua也可以。 

jvm是一个平台, 设计到和操作系统直接沟通的地方, 用jni就是自找麻烦。

“ decision over convention, convention over configuration"

这就是为什么要坚持两个凡是的原因

恋你朝朝暮暮 2021-11-24 00:35:33

回复
android中实现http协议太简单了

长安忆 2021-11-24 00:35:33

用C简单实现一个http协议也是可以的,这么做过,不依赖任何库,代码量也不大,但是是单线程阻塞模型的。

泛泛之交 2021-11-24 00:35:28

什么错误?

悲喜皆因你 2021-11-24 00:35:26

引用来自“fcsong000833”的答案

引用来自“南湖船老大”的答案

建议去iteye的高级语言虚拟机群问问

梦里兽 2021-11-24 00:35:25

何必呢,在JE里面马上就有回答的。

瑾夏年华 2021-11-24 00:35:10

建议去iteye的高级语言虚拟机群问问

怎言笑 2021-11-24 00:35:09

建议去iteye的高级语言虚拟机群问问

眼泪淡了忧伤 2021-11-24 00:34:42

问题没解决啊 , 继续请求帮忙 ....

如此安好 2021-11-24 00:33:53

非常感谢,虽然现在用其他方式暂时规避了这个问题,但这个代码还是很有价值。谢谢

终遇你 2021-11-23 20:54:38

回复
还有个问题忘了说,JNIEnv是针对线程有效的,所以尽量不要通过变量保存其指针,最好每次都使用JNI方法传过来的参数,如果需要在一些已经定义好的回调接口中使用,应该用JavaVM的AttachCurrentThread来获取当前线程的JNIEnv

滥情空心 2021-11-23 05:49:37

测试了一上午发现原来不是C调用java接口出了问题,而是在java调用C接口时出问题,如下C接口

int Java_com_example_jni_jni_jniRead( JNIEnv* env, jobject obj, jbyteArray data, jint datalen){

 jbyte *s8data; 

 s8data = (*env)->GetByteArrayElements(env,data,0);

//以下两句存在不存在都一个样

 (*env)->DeleteLocalRef(env, s8data);

s8data = NULL;

return 0;

}

就这么个简单接口调用N(大概900多次)就崩溃,屏蔽GetByteArrayElements

正常,请教是什么原因呢,该如何修改??

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文