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. ...
随机推荐
- Win10新建文件不自动刷新
Win10 桌面创建文件/文件夹需要F5刷新才出来,资源管理器中创建也是一样的问题. 网上搜索的结果都以修改注册表,禁用音频面板检测,上述方案可能能解决部分情况. 实际上是桌面图标缓存出问题,以下是一 ...
- windows系统的对象管理
windows中的对象和高级编程语言中所说的对象还欧区别,准确来讲,windows中的对象其实指的是一种数据结构并且是一种带着“对象头(object head)” 的数据结构! 所以windows中 ...
- 使用Custom Draw优雅的实现ListCtrl的重绘
common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里也只给出了一些如风的解释和例子,没有谁告诉你你想知道的,和 ...
- Oracle 学习笔记 12 -- 序列、索引、同义词
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/Topyuluo/article/details/24232449 数据库的对象包含:表.视图.序列. ...
- decorators.xml的用法
spring,hibernate框架做的,对了,还有jQuery.我用jquery做异步请求到后台,生成json数据返回前台生成下拉输入框,请求到后台以后,成功生成了json数据并根据struts的映 ...
- SSH三大框架的搭建整合(struts2+spring+hibernate)
本文转载自:https://blog.csdn.net/kyle0349/article/details/51751913
- 详解MySQL第三篇—DCL语句
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句.这些语句定义了数据库.表.字段.用户的访问权限和安全级别.主要的语句关键字包括 g ...
- CF519 ABCD D. A and B and Interesting Substrings(map,好题)
A:http://codeforces.com/problemset/problem/519/A 水题没什么好说的. #include <iostream> #include <st ...
- PAT 1091 Acute Stroke [难][bfs]
1091 Acute Stroke (30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the ...
- 细说PHP的FPM
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++基础概念++ C ...