昨天拿到JNI的Android工程Demo,然后把demo整合到开发的主线工程上,发现调用JNI方法一直抛同一个异常

java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()

我以为是JNI的so库有问题,但是demo运行时正常的,我无法找到原因的所在。我可以确认的我自己的问题,今天上午问到另外一个写C的同事,向他描述了我的情况。然后他问我是不是包名不一致的原因,我恍然大悟。确实在我移植到主线上的工程时,将定于调用JNI的包名改掉了。而so库在编译的时候,是有指定调用的包名的,这个就可以解释为何demo运行正常。只需要保证android工程调用JNI的包名与so库定义的包名类名方法名一致就可以了。

下面简单介绍一下JNI的 .h文件的内容

#ifndef _Included_packagename_classname   //packagename 指的是android工程中的包名 classname指的是android工程中定义JNI的类,该类包含调用JNI的方法
#define _Included_packagename_classname
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: packagename_classname
* Method: methodName
*/
JNIEXPORT jint JNICALL Java_packagename_classname_methodname(); // jint 指的返回数据类型为int,JNICALL 后面指定了调用JNI方法的包名和类名、方法名...

JNI的 .c文件格式如下

#include "packagename_classname.h"  // 这个是指的定义.h文件的命名,必须与.h文件的命名一致
#include <stdio.h> #include "../../../src/classname.h" // 包含src目录下定义的.h文件 #include <android/log.h>
static char *tag = "logtag_jni"; // 定义打印log的标签 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , tag, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , tag, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , tag, __VA_ARGS__)
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, tag, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , tag, __VA_ARGS__) /*
* Class: packagename_classname
* Method: methodName
*/
JNIEXPORT jint JNICALL Java_packagename_classname_methodName(){...} ......
}

了解这些,帮助理解JNI就容易多了

JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法的更多相关文章

  1. javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver错误解决办法

    今天不用eclipse.myeclipse等开发工具,纯手写JSP页面(有点作死)时突然出现以前从来没遇到过的问题,报错如下: HTTP Status 500 - java.lang.NoClassD ...

  2. java.lang.IllegalArgumentException: Wrong FS ...异常的解决

    配置完Hbase后,启动,JPS发现少了HMaster这个进程.查看了一下日志如下: java.lang.IllegalArgumentException: Wrong FS: hdfs://192. ...

  3. spring mvc 框架启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal 解决办法

    今天准备将以前自己搭建的一个框架拿出来用一下,结果发现启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/Elem ...

  4. Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法

    使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 ActionContext c ...

  5. java.lang.OutOfMemoryError: PermGen space异常及解决

    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 ...

  6. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决办法

    这个问题的原因是没有导入mysql连接库,我从官网上下载后照着网上的教程各种导入无果,最后发现是我导入的文件错了.... 官网上下下来的压缩文件是这个,不过这并不是直接要导入的文件,首先解压文件,然后 ...

  7. Android 调用.so包时报错:No implementation found for native Lxxx, java.lang.UnsatisfiedLinkError: XXX时的解决办法(转)

    问题就是在调用自己同事写的.so包时,怎么也掉不通,程序一直报错退出,错误内容就是: 1 No implementation found for native Lxxx, 2 Java.lang.Un ...

  8. ambari-server启动出现Caused by: java.lang.RuntimeException:java.lang.ClassNotFoundEception:com.mysql.jdbc.Driver问题解决办法(图文详解)

    不多说,直接上干货! 问题详解 启动ambari-server出现 Caused by: java.lang.RuntimeException:java.lang.ClassNotFoundEcept ...

  9. 【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法

    错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误.报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/a ...

随机推荐

  1. Linq101-Generation

    using System; using System.Linq; namespace Linq101 { class Generation { /// <summary> /// This ...

  2. updatepanel的属性

    updatepanel的属性 1.childrenastriggers:内容模板内的子控件的回发是否更新本模板(和updatemode的conditional有关) 2.updatemode:内容模板 ...

  3. How JSP work.

    A JSP page exists in three forms: JSP source code: consists of a mix of HTML template code. Java lan ...

  4. Sql Server 远程过程调用失败

    很多搞开发的同志们,相信在刚刚使用sql server2008+c#2012(2012以上版本)会出现下面图片中的问题,这时因为安装Visual Studio 2013或者2012版本的时候,会自动安 ...

  5. Building,Packaging,Deploying,and Administering Applications and Types

    在我们进入章节之前,我们讨论一下生成.打包和部署你的应用程序和应用程序类型必须的步骤.在这章里,我关注的是如何为你的应用程序的用途生成程序集.在第三章,"共享程序集合和强命名程序集" ...

  6. QFormLayout

    这个是官方的文档,现在还没有翻译,有时间自己会把这个好好的翻译一下. QFormLayout类是用来管理表格的输入部件以及和它们相关联的标签. 也就是说QFormLayout这个布局一般情况下是用来在 ...

  7. arp断网攻击解决办法

    局域网中有这个提示arp断网攻击是正常的,说明防火墙已经拦截了,是有人用P2P工具控制你的网速,或者是局域网有机器中病毒了也会有这样的提示,不过不用担心,今天给大家带来几个防止arp断网攻击的办法,希 ...

  8. PHP开发套件

    Windows系统下开发 环境配置: PHPstudy----立即下载 开发工具: PHPstorm----立即下载 引用一个注册服务器地址:潘田--phpstorm 2016.1注册码 当然推荐大家 ...

  9. VISUAL STUDIO 2005连接MYSQL数据库

    // mysql.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include &l ...

  10. Memcached源码分析——slab的初始化

    以下内容仅为本人的笔记. /** * Determines the chunk sizes and initializes the slab class descriptors * according ...