android JNI 使用的两种形式 --自己实现c和调用第三方so库

这篇博客介绍了在Android中使用JNI的两种方式:一是自定义C代码,通过`javah`命令生成头文件并实现功能;二是调用第三方SO库,需要将库放入`libs`目录,并正确声明加载动态库。关键在于理解JNI的包名和类名要求,以及如何处理第三方库的调用问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 在调用JNI的工程中实现JNI代码

JNI调用,一般书上都会给你讲第一种形式,自己写JNI代码,,然后编译使用,在eclipse中  --项目--右键-   Android tools --添加本地支持(add native support)。然后编译运行就可以了。 自己写JNI代码,首先声明java native调用,然后用javah 命令生成 JNI形式的头文件,这个文件就是声明的 java native 声明 所对应的形式,然后自己按照这个形式写一个.c实现形式,就是自己的功能。声明的形式,其实就是 java + 包名+类名的形式。这个网上很多教程都讲有。这个链接中有讲到 javah 命令需要 到classes目录下执行。

http://blog.youkuaiyun.com/xnwyd/article/details/7086384

===============================

我们用ls命令查看,可以看到bin目录下有个classes目录,其目录结构为classes/org/tonny/jni,即classes的子目录结构是android工程的包名org.tonny.jni。请注意,下面我们准备执行javah命令的时候,必须进入到org/tonny/jni的上级目录,即classes目录,否则javah会提示找不到相关的java类。

========================

2. 调用第三方so库,两个条件,1。把so库放到libs下面,注意把armeabi这样的目录一起复制进来,对应不同的架构,2. 把java native 声明的类和包加入到工程中。

   如果只是简单的在调用so库的类中声明 和加载动态库的话,是会报找不到so库的链接错误。这个原因,估计是程序去了默认的路径 也就是Android系统库(/system/lib)下面去查找了,所以查找不到(猜测,也许只是 调用的形式不对而导致 无法调用到而已。。。。系统的动态库,估计就是这样简单的声明native一下方法,然后加载动态库就可以用了)。

  public nativeString  getRootURLFromJNI();

  publicnative String getKeyNameFromJNI();

  publicnative String getKeyValueFromJNI();

  static {

        System.loadLibrary("xxxx");

     }

   }

直接在代码中声明然后加载动态库,运行就挂求了。



考虑到 JNI的形式,是 有包名  类名的,这么强调应该是有要求的,所以把JNI的java native声明类也加入到工程中,然后在调用的地方,使用一个声明类的对象来调用JNI方法。这样就可以了。



总之,第一种形式,已经自然的包含了包名 类名了,调用第三方的 so库,则要加入对应的包名和类名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值