Eclipse中安卓jni小demo

86 篇文章 1 订阅
74 篇文章 1 订阅

昨天下午偶然间看到公司代码用到了jni技术,自己也突然心血来潮想自己实践下,写个小demo,过程中也遇到几个问题,之后会跟大家一并说明的,不说了,直接来demo,只要按照步骤one by one就可以实现自己的第一个jni工程

首先说明,此demo是在Eclipse中实现的,返回一个字符串到MainActivity,然后自己去打印或者弹吐司都可以,主要是熟悉jni在Eclipse中的开发流程,我们从配置NDK开始

(1)配置NDK路径,在Eclipse软件的Window->Preferences->NDK Location,配置过了的就不用再配置路径了,没有ndk开发包的同学得先去网上下载一个,网上一搜一大堆.配置路径如下图:

(2) Eclipse中新建安卓工程,定义好本地方法,我们只是小demo,只返回一个字符串即可,如下:


在MainActivity中定义一个本地方法,方法名可以随便取,但是native关键字是必须有的,我们是打印返回回来的字符串

(3) 右击工程选择Android Tools->Add Native Support.此时会弹出一个对话框要求输入即将生成的so库的文件名,然后Eclipse工程会自动生成jni目录,里面有Andorid.mk和xxx.cpp文件,如下图:

自己输入的so库名稍微记住一下,稍后写静态代码块动态加载so库的时候用得上;而且需要注意:虽然你输入了so库名,但 是系统自动在前面加上lib,也就是说生成的so库文件最终是以libxxx.so的形式命名生成

(4) 重命名xxx.cpp文件为xxx.c并且修改Android.mk文件里的LOCAL_SRC_FILES属性为xxx.c,因为修改xxx.cpp文件的后缀,所以这里也需要修改,Android.mk里的内容就不一一介绍了,接触过Android系统编译的开发人员都看得懂,看不懂的同学可以去网上学习一下,另外还需要在jni目录下创建一个Application.mk的文件,里面只写上APP_ABI := all即可,意思是生成各个abi的so库,具体如下图:


上图是安卓工程jni目录里的文件列表,只有三个


上图是Android.mk里的内容,LOCAL_MODULE属性值就是第三步你输入的so库的库名;LOCAL_SRC_FILES属性需要修改一下, 因为将xxx.cpp文件重命名了为xxx.c,所以这里也需要修改下

(5)实现.c文件里的本地方法,具体如下图:

实现MainActivity里定义的本地方法,这里只是返回一个字符串而已

(6)在java文件中的静态代码块中加载.so库文件:

System.loadLibrary()方法里的参数只写你输入的so库的库名,也就是Android.mk文件里的LOCAL_MODULE属性值,千万不 要写上so库的全库名,因为系统会自动在前面加上lib然后拼接你输入的so库的库名

(7) 运行工程到安卓设备上测试jni是否成功调用了本地方法

------------------------------------------//--------------------------------------------------------------------

以上是jni在Eclipse中的开发流程,但是没有什么事是一帆风顺的,在这个小demo里遇到的问题也跟大家说下

(1)第一个问题:右击工程运行,但是报错,报错信息:

java.lang.UnsatisfiedLinkError: Couldn't load hello-jni from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.hellojni-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.hellojni-1, /system/lib]]]: findLibrary returned null

这是由于没有正确生成so库,看最后一句findLibrary returned null就明白了,工程的libs目录下也没有生成so库文件;造成的原因可能有很多种,我的原因是这样排查出来的:我配置好ndk-build命令的环境变量之后cd到工程的jni目录下执行ndk-build命令,结果报NDK path cannot contain any spaces!错误信息,这才知道是我把ndk开发包放到了一个带有空格的目录下,也就是说ndk开发包所在目录的所有父级目录都不能带有空格或者其他非法字符,后来重新放了一个位置重新配置了ndk-build命令的环境变量,运行就没问题了

(2) 第二个问题:在.c源文件中实现native方法时,出现jstring,JNIEnv,jobject,NewStringUTF等这些字符串无法被解析识别的错误,是由于没有关联include目录,这个目录里有jni.h头文件,这个头文件定义了这些字符串的含义,所以关联上了就能识别了不会报could not be resolved这样的错误信息了,具体关联方法如下图:


点击Project-->preference就能弹出上图的对话框


总结:

之前自己也到网上查找过在Eclipse中实现jni,但是发现都太繁琐,一个.h头文件的生成就能折腾你半天,我的这个流程从头到尾都没有说要去自己生成.h的头文件,因为自动生成了,所以应该是最简单的方法流程了;之前遇到问题,网上一搜都是说什么使用javac命令先将.java文件生成.classe文件,或者说要生成.h文件或者说要使用-encoding参数或者说要使用-classpath参数等等,其实都是繁琐的步骤,这些可以统统不要,而且这些步骤不明白原理容易出错,只要按照以上的步骤就能实现,本人亲测,最后希望各位大神能多多分享技术博客,继承安卓的开源共享的精神

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值