参考:

https://blog.csdn.net/fred_lzy/article/details/53159138

https://blog.csdn.net/avi3/article/details/83330334

项目开发过程中,需要用到C/C++开源代码的功能,而框架是java环境,考虑到c++效率更高而且又有现成的,所以选择jni。碰到一些问题,最终都解决了,现总结如下:

1、内存溢出错误Crash due to Stack Overflow

  程序运行过程中碰到第一篇博客中描述的问题4.1.3 Crash due to Stack Overflow,后来通过调整JVM参数,设置-Xss2m将内存溢出问题解决,若处理数据量上升到一定程度恐怕仍然会有问题。

为降低内存使用,将c++中用到的全局变量依据应用需求适当缩小,同时将c++返回到java环境的对象也缩小,并重复利用,而不是重复new object(gc处理不及时内存占用比较高),同时还增加了手动内存回收(System.gc(),虽然有延迟但效果也不错)。

2、jni部分env.FindClass(“java/util/ArrayList”)失败

  本来开源代码里基本都是纯C,变量都是全局的,后来对其进行拆解,封装关键代码,想用C++面向对象的思想封装成局部可用的对象,这样后续利用多线程提升处理效率也可行,结果碰到上述问题。

  因项目组其他成员直接对源码进行封装,使用的全局变量未出现该问题,所以以为C/C++转换到java的对象只能是全局变量。后来在调试问题1时发现,C++封装的源码中有个二维数组未赋初始值就使用,并且与0.0进行比较(如下),怀疑所有问题都是由于这个造成的,所以还是按照原思路整理封装的开源C代码,去掉冗余的部分(因是无线信号传播领域的算法,不太敢修改源代码,后来请教相关同事后去掉了大部分不需要的部分),问题得到解决。

struct LR {
double frq_mhz;
double conf;
double rel;
float antenna[][];
};
...
  pattern = (double)LR.antenna[(int)azimuth][x];
  if (pattern != 0.0) {
pattern = 20.0 * log10(pattern);
loss -= pattern;
}
...

3、java数值出现NaN

java环境下调用jni方法,返回NaN的double型数据,后来分别在java和C++环境下调试,输入同样的参数,在c++中特定参数为负值时也出现了NaN,发现开源算法中对浮点数的比较有问题,如2中提到的

pattern != 0.0判断,作为log真数不能为负数,未经初始赋值的LR,float类型变量会在0左右浮动,这种判断语句就存在问题,应改为pattern > 0.0 或 pattern > 0.0000001

jni使用问题总结的更多相关文章

  1. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  2. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  3. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  4. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...

  5. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  6. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  7. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  8. android JNI 调用NDK方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  9. jni操作jobject

    一. 注册JNI函数 1.         静态方法 一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率. 2.         动态注册 使用JNINativeMe ...

  10. JNI开发的常见错误

    1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...

随机推荐

  1. Python并行编程(二):基于线程的并行

    1.介绍 软件应用中使用最广泛的并行编程范例是多线程.通常一个应用有一个进程,分成多个独立的线程,并行运行.互相配合,执行不同类型的任务. 线程是独立的处理流程,可以和系统的其他线程并行或并发地执行. ...

  2. Linux 2.6 内核阅读笔记 中断和异常

    2014年7月24日 中断门.陷阱门及中断门 中断是能够禁止的,能够通过告诉PIC停止对某个中断的公布.被禁止的中断是不会丢失的,在解除禁止后又会发送到CPU上. 禁止中断和屏蔽(mask)中断的不同 ...

  3. spring 拾遗

    1.@PostConstruct VS  init-method 1.1 both BeanPostProcessor 1.2 @PostConstruct is a JSR-250 annotati ...

  4. struts2之Action获取请求参数与web元素

    文章思路清晰 http://blog.csdn.net/zeqblog/article/details/8665052

  5. Oracle中查看建立索引和使用索引的注意点

    一.查看和建立索引 select * from user_indexes where table_name = 'student' create index i_student_num on stud ...

  6. Android适配不同的设备

    感谢原作者的整理: http://blog.csdn.net/chenyjays/article/details/41308887 适配不同的语言 把UI中的字符串存储在外部文件,通过代码提取. 创建 ...

  7. 深入了解SQL Tuning Advisor(转载)

    1.前言:一直以来SQL调优都是DBA比较费力的技术活,而且很多DBA如果没有从事过开发的工作,那么调优更是一项头疼的工作,即使是SQL调优很厉害的高手,在SQL调优的过程中也要不停的分析执行计划.加 ...

  8. [笔记]Win10下编译Tesseract-OCR 4.0

    Tesseract-OCR 4.0使用了LSTM网络,准确性相比3.x版本提升不少. 官网提供的安装包会提供一堆DLL,而我需要的是一个静态链接的exe文件,所以只能重新编译. 编译环境 Window ...

  9. Django:学习笔记(9)——用户身份认证

    Django:学习笔记(9)——用户身份认证 User

  10. html-4, form 表单 输入、传文件、单选、多选、下拉菜单、文本描述、重置、submit、按钮限制输入

    <!-- form HTTP协议 action:提交的服务器网址 method:get(默认)| post(应用:登录注册.上传文件) 页面中的a img link 默认是get请求 input ...