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[]时)

  • 相关阅读:
    shell 遍历当前目录以及所有子目录下文件
    linux shell 字符串操作(长度,查找,替换)详解
    将自定义结构存入std::set 或者 std::map
    CentOS下搭建SVN服务器
    基于Debian的linux系统软件安装命令
    rm搭配grep删除符合条件的文件
    Centos系统环境
    怎么恢复用mysqldump备份数据和恢复数据
    mac 安装 node.js 的 canvas
    centos 6.5 安装 node.js 的 canvas模块
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/5000019.html
Copyright © 2011-2022 走看看