注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android系列九对JNI调用动态库的再说明  

2015-04-08 10:30:35|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android系列九对JNI调用动态库的再说明

在前面讲过Android使用JNI的方法创建和调用SO的方式,从那儿以后,大约有两年没有用过了,今天重新要测试一个SO库,所以又创建一个同样的工程,遇到了不少的问题,可见当初的几篇博文介绍的还是太粗,这里再把细节补充一下。(也可以看一下Jna中调用SO库时的设置,这个和JNI在设置时是一样的。具体看录像

这里还是从头说,直接手动配置和命令行执行的方式:

1、配置NDK的自动编译,右键当前工程,点击“属性”,弹出下面的对话框,找到Builders这个选项,在右侧点击“New

Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 

2、在弹出的对话框中,再选择红色的选项,点击OK,才会出具体的配置界面:

Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 

选择Program这个选项才会出,原来在“Android系列二基本程序”中的说明中漏了这一步,同时,如果不选中红色框中的Program选项,在弹出的框中,会少一些选项,或者说选择两个不同的选项,其的配置项是不同的。

比如下面的“During Auto builds”这个选项就没有,所以这里还是少说了几句,这些细节可真让自己吃了不少的苦头,耽误了好长的时间。

3、配置“Main”和“Build Option”两个选项卡:

注意:Main选项卡中选择第二个“Browse File System

 Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客
 

4、在“Build Option”中选择上图的配置后,点击“Specify Resource”,配置下面的选项,如下图:

这样,就把NDK的编译自动完成了。

 Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 

Javah –classpath   bin\classes –d jni com.example.mytestso.MyTestSo

Javah –classpath   bin\classes –d jni com.example.testndkoption.TestNDKOption

(说明:这里TestOptionNDKTestNDKOption弄混了,详细见下面说明,同时, -d前面这个-号拷贝到命令环境中要改写一下,否则报错。)

再说明: com.example.testndkoption.TestNDKOption这个路径与bin\classes下的文件夹和具体的文件名路径要保持一致,否则会报找不到类的错误。

或者说跟类所有的包名要操持一致,其实正常的情况这个包名就是TestNDKOption.java生成的TestNDKOption.class文件的具体的路径名。

package com.example.testndkoption;

import android.app.Activity;
import android.app.AlertDialog;

class TestNDKOption {
public native int GetIntData();
//
其下为数据中间层接口函数
//
说明:因为JAVA没引用,所以此处返回数组,这样,回传的一个参数不再传递了

public native int StartTestOption();

}

Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 

其实主要还是要和Native的类保持一致。前面博文中提到的还是初始的版本中(主要是把最后的版本用最初的方法来实现产生的混淆),即所有的Native的函数都在MyTestSo这个Activity这个界面类中,后来把它单独独立出来一个IrilLib这个类,上面的编译就得改成:

Javah –classpath   bin\classes –d jni com.example.mytestso.IrisLib

一定得记得前文中提到的,能够在bin\classes\com\exmple\mytestso下可以找到相就的IrisLib.java,也就是说的编译出来“记住,一定要生成这个类文件才可以使用这个命令”,这里一时没弄清楚的是:

–classpath   bin\classes:指定–classpath 的位置在  bin\classes这个文件夹(Android工程中都有这个文件夹),当然如果如网上讲的,进入其它的路径,只要按照相对来设置也行,比如进入bin\classes文件夹中,就不用写这个选项了。

-d  jni指新建立的JNI文件夹,这个也和上面的一样,如果进入其它路径,可用相对路径来设置,比如在上面说的进入bin\classes后,就得改成:

Javah   –d  ..\..\jni   com.example.mytestso.IrisLib

 

这里遇到了两个问题:

第一个是:无法访问android.app.Activity,找不到android.app.Activity的类文件,这个原因是把Native的接口函数都放到别的类中了,还去用javah ActivityTestOptionNDK)类中创建,也就是说,javah中使用的类不但要生成,还要和你包含Native函数的类名一致。这里算是重复一下。

这个在其它的网上资料说cmd命令行进入src文件夹就可以了,但这里不是这种情况。

http://blog.csdn.net/lg878398509/article/details/17484361

第二个是:找不到“XXX”的类文件,这个其实和上面的道理基本一样,把类的名字写错了,特别是写测试工程时,把Native导出函数的类名和工程Activity的类名写得极其相似,就如上面那个例子TestOptionNDKTestNDKOption看下图:

另外,一定再强调一下,Android.mk这个Makefile文件是手动创建的,当然可以去现有的工程去拷贝过来修改。

 Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 

 

Android编写JNI时,一般是手动创建JNI这个文件夹,但是也可以用Eclipse这个工具来实现,方法是:

1、  Eclipse的工程选项上右键,选择“Android Tool

2、  在弹出菜单中选择最下面的“Add Native Support

Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 

同样,也可以在Eclipse配置Javah外部工具方法(工具栏上有),不使用命令行方式:

Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

 

这个点击一下后,要新建一个配置:

-v -classpath "${project_loc}/bin/classes" -d "${project_loc}/jni" ${java_type_name}

如下图:

 Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

Android系列九对JNI调用动态库的再说明 - 还东国 - 还东国的博客

  配置好后,在Eclipse中点击刚才配置好的javah工具,就会自动生成.h文件。再加上前面会提到的自动添加JNI文件夹时产生的.cpp文件,就可以自动的生成SO的挂载接口了。

 细节耽误时间啊。

  评论这张
 
阅读(316)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017