jni使用问题总结
参考:
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使用问题总结的更多相关文章
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- JNI 备注
本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- android JNI 调用NDK方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- jni操作jobject
一. 注册JNI函数 1. 静态方法 一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率. 2. 动态注册 使用JNINativeMe ...
- JNI开发的常见错误
1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...
随机推荐
- 配置MDM的描述文件
配置描述文件 首先需要一个 MDM 配置描述文件,此文件用于安装到设备上,使其向 MDM 服务器注册为受管理的设备. 1.凭证 用iphone配置使用工具,新建一个配置描述文件,在“凭证”栏,创建新凭 ...
- vim 设置字体和解决乱码
在 C:\Program Files (x86)\Vim 目录中的 _vimrc 文件中加入下面两行 set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bo ...
- 前端 javascript 数据类型 布尔类型
python 是大写 True javascript 是小写 true false 也是 布尔类型仅包含真假,与Python不同的是其首字母小写. == 比较值相等 != 不等于 ...
- 前端 javascript 写代码方式
javascript 和python一样可以用终端写代码 写Js代码: - html文件中编写 - 临时,浏览器的终端 console
- 小tip: 使用SVG寥寥数行实现圆环loading进度效果
二.正文 设计师设计了一个图片上传圆环loading进度效果.如下截图: 首先,CSS3是可以实现的,以前写过一篇转大饼的文章:“CSS3实现鸡蛋饼饼状图loading等待转转转”.原理跟这个一模一样 ...
- TensorFlow学习笔记(七)TesnorFlow实现计算加速
目录: 一.TensorFlow使用GPU 二.深度学习训练与并行模式 三.多GPU并行 四.分布式TensorFlow 4.1分布式TensorFlow的原理 4.2分布式TensorFlow模型训 ...
- Lua4.0中getn陷阱
Lua4.0中getn潜规则 • 使用t[n] = nil方式删除元素会导致意外结果 t = {, , , , , , , , , }; t[] = nil; t = {, , , , , , , , ...
- 美化MFC 之调整静态文本的颜色 字体。 用于添加公司标题 联系方式 口号等数据
很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调, 因此很多人往往找到很多其它的控件对对话框进行美化修饰, 例如给静态控件设置字体,设置背景颜色等等, 其实这些完全可以由VC自 ...
- .net:Code First 创建或更新数据库
控制台输入命令: 切换到项目的project.json 文件所在文件 dotnet ef migrations add XXX dotnet ef database update Visual Stu ...
- Shiro安全框架入门篇
一.Shiro框架介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和JavaEE项目中都可以使用.它主要用来处理身份认证,授权,企业会话管理和加 ...