最近在调试 车辆识别demo,说实话,虽然最初接触jni的时候,是在eclipse工程中进行开发的,
不过后面遇到的项目都是直接放到了android 源码中编译的,所以对于在eclipse中的ndk开发,其实记忆有点模糊了,包括 Android.mk的编写,都有点小区别吧。
这里简单记录下,权当简单回顾吧。
一、需要准备和安装 的东东
1)cygwin cygwin还是蛮强大的,相当于是在window环境上,提供了个 unix操作的环境吧。后面在window上编译 so还得靠它;
2)android-ndk-*** ,这个的版本很多,也不清楚目前最新的版本是多少了,不过都没有太大的关系,我使用的 android-ndk-r8b,这个是提供了编译 so需要的工具,而且也提供了些 jni 的sample;
cygwin 的安装就有点坑了,如果是选择 从网络上下载安装,也不清楚是哪个网址能成功下载的,估计得翻墙才行;不过之前安装的时候,的确是选择 网络安装,也能成功安装,只是忘了选择哪个网址了,这次也试了很多了网点,不过不是网速太慢,就是中途有报错了。
所以后面选择的是本地安装了,还好之前安装过一次成功的,这次本地安装完后,直接把之前安装好的 bin目录,直接替换现在安装的bin目录,然后需要安装的一些东西就不会缺少了。
二、cygwin 的简单使用
1)简单映射下硬盘,方便后面的操作,如下图,后面直接 cd win_c,就是切换到 c盘啦
2)配置下 ndk路径,在 .bashrc 中添加 如图所示内容,相应的ndk路径根据自己自己实际情况而定,我这边是直接放在了 d盘
3)配好了环境,当然是需要 source 一下啦
4)完成了上面几步,我们就来看下有没有生效啦,ndk提供的demo就派上用场了,切换到 ndk 的samples目录,我这里测的是hello-jni,
切到hello_jni 目录下后,ndk-build 下。(我这里可能有点问题,虽然install 成功了,后面copy到libs/armeabi的时候出错了,不过这丝毫不影响我们后面实际项目的使用,只要install没报错就ok了)
三、编译 车辆识别项目 jni
前面的工作做好了,现在就可以来编编我们的项目了,切到项目工程 的jni目录下(一般jni相关的都放在了jni目录下,当然这个目录视自己实际情况而定),
然后很简单的ndk-build 下下,ok,需要的so 成功生成了,我们可以看到 这时会在工程的 libs/armerbi下生成了我们需要的so。
------- JNI 编程 最最简单步骤 ---------------------------------------------------------------------
本地时间 19:02,而且是周六,其实不想写了,不过又想想不能偷懒,所以还是接着简单写下下~
1)javah + native 类路径,生成相应的 .h文件
2)根据 .h 文件,新建对应的 .cpp文件,并实现相应的方法
3)javap -s + native类路径,查看java 方法签名。(个人觉得这个还是挺好用的,不过也只有在 我们的jni需要放到 android 源码中编译的时候,需要写 方法映射 的时候才用的上)
前面说的是调通别人提供的demo,这在将demo的功能移值到实际项目中的时候,还是遇到了点问题。首先就是新建了native 类,重新 生成so的问题。
【遇到的问题】
1、javah +native 类名,提示找不到 类 Bitmap
找不到Bitmap,那就是android.jar 没找到,ok, -classpath 指定下android.jar路径
这时报错 找不到“com.visdom.lprtest.LPR”了,
原来完整的用法应该是如下图所示,除了指定需要的jar,还需要指定当前路径,不过同样的写法在cmd中输入是可以的,在cygwin中就报错了,原因不详。
不过这样能生成 .h就可以了,不影响下一步的进行了。(这里得说明下,如果写的native方法,不需要import其他类的话,直接 javah + native类就可以生成 .h了)
image下面再相对应的修改下 jni目录下的Android.mk 需要编译的文件,就可以在cygwin中切到该jni目录下,ndk-build了
好了,下面就可以看到在armeabi目录下生成我们需要的libLPRJNI.so了
2、安装apk后,切到 data/data/包名/libs 目录下,发现没有 .so文件???
这个问题就得说下 adb push 和 adb install 的区别了,如果直接adb push 到安装目录的话,libs目录下是不会有so文件的,如果是 adb install的话,则是有的。
而我调试的,因为签名关系,只能采用 adb push的方式,这种情况下,需要加载的so就需要手动的push 到system/lib目录下了。
网友评论