折腾了五天,终于把公司的算法封装好了,写好了测试的demo。记录一下过程,防止自己忘记,因为从来没有写过android的东西。
主要从以下几个方面记录一下:
1.编译的方式:
编译.so库一般有两种方式,一个是NDK编译,一个是CmakeList编译。一开始我从网上找编译方面的资料,全部都是NDK编译的,NDK编译有一个缺点就是需要从命令行使用javah命令,或者自己在AS里面配置这些命令,生成的头文件也比较奇怪,整个工程的结构不是很清晰,对于新手来说很容易看晕,所以我就被搞晕了,因为从来没有开发过android。如果你熟悉NDK编译网上的资料有很多,很多写的很好的。还好,AS还给我们提供了另一种编译的方式,从2.X版本以后,具体的我记不清了,android studio开始源生支持CmakeList,所以我们可以直接自己编写CmakeList来生成.so库,整个工程也非常清晰,我是这样做的:新建两个工程,一个编译.so,一个编写工程代码。都要在新建的时候指明including C/C++
2.so库编译时候CmakeList和build.gradle的编写
这两个文件位于app的目录下,编写时候的注意点:
对于gradle文件:
要在app下的libs文件夹里拖入你需要用到的第三方.so库,注意要连不通架构名的文件夹一起拖进去,同时要指明所在位置为libs文件夹。
对于CmakeList:
3.Jni的编写
Jni是一个大坑!因为会遇到各种奇奇怪怪数据传输的问题。首先,在demo中的MainActivity里面声明哪些是native函数,这时候编译器会提示你去创建这个函数,所有的JNI函数实现都会被创建在native-lib.cpp的源文件里面,在这里你需要你调用已经编译好的.so库的接口,并且返回数据给java层。在这里我遇到的一个问题就是Jni传输ArrayList<Obj>类型到Java层,我在网上找了很多Jni的例子,千篇一律都是使用先使用FindClass找到ArrayList与自定义的Obj类,再找到MethodID(ArrayList的add方法和Obj的构造函数),再去获得属性(FiledID),New对象(NewObject),再去调用这些方法返回给java,但是不知道为什么一直报非静态方法的错误,后来经我的师傅指点,原来Jni有个方法就叫GetObjectArray,直接可以往里面塞对象,这样就可以很方便的返回一个ArrayList<Obj>,Jni的具体语法可以去参考Jni的官方文档,写的比较清楚。
----------------------------------------暂时记录这么多,不定期更新----------------------------------------------------