
引用第三方SO文件,在 eclipse工程里编译的时候,如果把so文件放在libs/armeabi/下的话,adt会直接给你自动把SO文件把包进去 。而在命令行下进行的话应该定义LOCAL_JNI_SHARED_LIBRARIES,
LOCAL_JNI_SHARED_LIBRARIES := libBMapApiEngine
这样还不行,这样直接编译会引发错误:找不到out/target/product/***/obj/lib/******.so
这时你需要把你的so文件放到out/target/product/***/obj/lib目录下。
这样再编译就没问题了。
另外在MK中文件中include $(BUILD_PACKAGE)是要编译这个工程,不加这个不会编译,MK文件具体写法请GOOGLE吧,呵呵。
安卓jni不生成lib文件1、android源码环境下编译so包,编出来的.so的包前面不会自动给添加lib,NDK编译会自动给添加lib,即使Android.mk文件里面LOCAL_MODULE :=名字前面没有lib,NDK也会自动给你添加lib. 所以NDK编译时Android.mk文件编译出来的so包名字可以加lib也可不加,但源码下编译必须加
2、系统应用和用户应用的区别
在package/app下的工程 编译后生成的apk都会在system/app下 将系统 烧录到手机后 这些apk都会作为系统应用,系统应用所使用到的.so库全部在system/lib下面,若没有则会出错。这就是为什么源码下编译jni生成的库会放在out/target/product/xxxxxxxx_xx_m0/system/lib
用户应用会默认到应用的data/data目录的lib文件夹下找.so,如果找不到就会报错误。当前前提是你的系统system/lib下没有同样的so文件.
3、adb push 与 adb install 区别
adb push 能够指定安装目录。比如执行"adb push xxx.apk system/app" 后,xxx.apk被安装到了system/app目录下。 这时候就是系统应用
adb install 用此命令安装的软件位于 data/app 目录,则为user application。
方法1 :人为建立上面的文件夹并将静态库拷入;
方法2 :
就是通过编译配置来做上面的动作。具体如下:
1. 将动态库的编译部分和静态库的编译部分分开;
2. 在工作目录下建立一个lib文件夹(必须是这个名字),将第三方的静态库拷贝进去,并且增加一个编译配置文件Android.mk,具体内容如下:
Android <wbr>: <wbr>编译动态库时如何引入静态库
这个编译配置文件就是要在obj下生成中间文件,供其他地方使用。
文件列表如下:
Android <wbr>: <wbr>编译动态库时如何引入静态库
3. 在工作目录下建立一个文件夹,并且将生成动态库的相关文件全部拷贝进去。这里我们起的名字是src,当然也可以起其他名字。Android.mk内容如下:
Android <wbr>: <wbr>编译动态库时如何引入静态库
这里只要直接引入第三方库就可以了。
文件列表如下:
Android <wbr>: <wbr>编译动态库时如何引入静态库
third_lib.h是静态库的头文件,test.cpp很简单,就是一个函数里面顺序调了一下静态库里开放的函数,内容如下:
Android <wbr>: <wbr>编译动态库时如何引入静态库
3. 工作目录下增加一个编译配置文件Android.mk,作用就是查找工作目录下所有的子目录中的Android.mk来编译。Android.mk的内容如下:
Android <wbr>: <wbr>编译动态库时如何引入静态库
好,工作都做完了,下面进入工作目录mm -B 试一下,可以顺利编译成功。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)