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库,则要加入对应的包名和类名。