参考:

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. pandas_datareader.data 和 fix_yahoo_finance 获取金融数据

    参考:https://zhuanlan.zhihu.com/p/35360694 1.获取数据 #定义所需要的数据 gafataDict={"谷歌":"GOOG" ...

  2. Python的一些教程(转)

    原文:http://blog.chinaunix.net/uid-26200547-id-3418038.html Python 安装配置及基本语法篇 Python 语言速成 Python 基本知识  ...

  3. Mybatis框架学习总结-Mybatis框架搭建和使用

    Mybatis介绍 Mybatis是一个支持普通SQL查询,存储过程,和高级映射的优秀持久层框架.Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.Mybatis可以使 ...

  4. mysql参照完整性 策略设置之 on update 和 on delete

    一.当表中有外键约束的时候参照表中数据的删除和修改违背参照完整性时 可根据以下策略进行处理 1.两条策略设置为cascade的时候 参照表中的数据修改或者删除的时候改表中数据也会被删除 2.两条策略设 ...

  5. 深入理解Flink核心技术(转载)

    作者:李呈祥 Flink项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多的人关注Flink项目.本文将深入分析Flink一些关键的技术与特性,希望能够帮助读者 ...

  6. php与oracle11g经典分页

    <?php $t1 = xdebug_time_index(); $conn = oci_connect("SCOTT","TIGER","19 ...

  7. iOS App 上架(Analysis 工具使用)

    随着iOS开发的流行,针对iOS开发涉及的方方面面,早有一些公司提供了专门的解决方案或工具.这些解决方案或工具包括:用户行为统计工具(友盟,Flurry,Google Analytics等), App ...

  8. Android中三种超实用的滑屏方式汇总(转载)

    Android中三种超实用的滑屏方式汇总   现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...

  9. JPush相关概念

    JPush相关概念 连接极光服务器前提 在连接极光服务器之前需要先将APP进行注册,连接Server时需要用到下发的两个字段:AppKey:应用唯一标识.Master Secret:服务器秘钥,用于服 ...

  10. ElasticSearch recovery过程源码分析

    [ES版本] 5.5.0 [分析过程] 找到Recovery有6种状态 public class RecoveryState implements ToXContent, Streamable { p ...