zoukankan      html  css  js  c++  java
  • android ndk程序UnsatisfiedLinkError解决方案

     1.UnsatisfiedlinkError:dll名称。说明dll没有放到合适的位置。对于Android开发,我们一般把so放在libs目录下,但是还是会出现这个错误。根本原因System.loadLibrary函数会加载你指定的so,该so中需要链接的所有符号都需要能够链接到,如果有一个链接不成功,那么整个so也会加载失败。仔细检查so中需要的所有符号,确保其存在且在正确的位置上。
       2.UnsatisfiedlinkError:方法名称。说明dll已经成功加载,但是方法名字错了。这个错误最最常见而且基本的解决方法是:仔细对比你的native 方法的原型确保与javah生成的原型一致。在java端修改native方法名称一定要记得更新c/c++端的函数名称,这是造成此类错误最常见的原因。
       3.JNI是采用了C风格的函数命名,所以如果用C++编译,则必须记得在每个函数前加上extern "C"的标记。
       4.local/global reference这些概念,只是跟jobject的指针相关(包括它的派生类如jclass),因为这些指针所指空间,如果为local的话,则会在作用域结束时被回收,所以做cache时才需要转化为global reference。

    而jfieldID和jmethodID查看头文件便可知与jobject无关,只是一些native的空间分配,因此与local/global这些JNI加入的新概念无关,按C/C++的做法去cache即可。

      5.GetStringRegion和GetStringUTFRegion的特别提醒

    这两个函数都有一个len的参数,表示Unicode字符的个数,但是要注意,这两个函数会在copy完字符串后,还会操作数组的第len+1个元素(GetStringUTFRegion会把[len+1]赋值为0,但是GetStringRegion很奇怪,并不会把[len+1]赋为0)!因此分配空间时就要分配len+1,否则嘛。。你的程序随时crash(当你执行delete[]时)

  • 相关阅读:
    ffmpeg rtmp推流 视频转码
    java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
    nginx stream 流转发,可以转发rtmp、mysql访问流,转发rtmp、jdbc请求
    java web http 转https 通过nginx代理访问
    linux 服务器磁盘挂载
    novnc 通过websockify代理 配置多点访问
    linux 文件服务 minio 安装部署配置
    AOP实现原理,手写aop
    java 泛型
    JAVA反射getGenericSuperclass()用法
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/5000019.html
Copyright © 2011-2022 走看看