项目背景:前期自己编写过一个本地库(libXXX.so)在...\libs\armeabi 下 ,现在用到用高德地图API,官方配置如下要把amapv302.so和amapv302ex.so加入...\libs\armeabi,但被eclipse自动删除
最后解决方法是将NDK-builder关了,然后把amapv302.so和和amapv302ex.so直接拷贝进...\libs\armeabi。
网上的解决方法一:
第一步: 在JNI文件夹下面生成一个新的目录prebuilt。把XXX.so拷贝进prebuilt.
第二步:
#编译第三方.so本地库
include $(CLEAR_VARS)LOCAL_MODULE :=amapv302LOCAL_SRC_FILES :=prebuilt/amapv302.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := amapv302exLOCAL_MODULE :=amapv302exLOCAL_SRC_FILES :=prebuilt/amapv302ex.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)#自己写的.so库include ../../sdk/native/jni/OpenCV.mkLOCAL_SRC_FILES := DetectionBasedTracker_jni.cppLOCAL_C_INCLUDES += $(LOCAL_PATH)LOCAL_LDLIBS += -llog -ldlLOCAL_MODULE := detection_based_trackerinclude $(BUILD_SHARED_LIBRARY)
但是这样生成的仅仅的文件没有lib前缀,程序运行后报错无法加载amapv302.so
如图:
方法二:
#编译第三方.so本地库include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := amapv302LOCAL_MODULE :=amapv302LOCAL_SRC_FILES :=prebuilt/libamapv302.soinclude $(PREBUILT_SHARED_LIBRARY)#include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := amapv302exLOCAL_MODULE :=amapv302exLOCAL_SRC_FILES :=prebuilt/libamapv302ex.soinclude $(PREBUILT_SHARED_LIBRARY)结果生成的libamapv302.so和 libamapv302ex.so 严重缩水,只有5k,运行报错,很多本地方法找不到。
原理: http://blog.csdn.net/zhandoushi1982/article/details/5316669
为什么会缩水:1,LOCAL_PATH := $(call my-dir)一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。2,include $( CLEAR_VARS)CLEAR_VARS由编译系统提供((可以在 android 安装目录下的/build/core/config.mk 文件看到其定义,为 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk)),指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。3,LOCAL_MODULE :=amapv302exLOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为\'foo\'的共享库模块,将会生成\'libfoo.so\'文件。4,LOCAL_SRC_FILES :=LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
暂时没懂,这个帖子里有人如是说,不知真假:
直接将locSDK3.SO拷进去就行了,android.mk之中不做任何修改,因为.mk是编译时用到的,相当于一个索引,用于指定编译哪些c文件,进而生成so文件,而既然是.so,说明文件已经编译过了,不需要再编译的,至于为什么会变小,是因为在.mk文件中指定了编译一个locSDK3.SO,编译时就会将现有的同名so删除,重新编译生成,而jni可能中没有任何对应c文件或者你没有指定编译哪些文件,所以文件so中几乎没有实际数据
后来一想,.so文件本来就是本地库,为什么还要把它当成源文件编译?
一般的本地库,只要放在...\libs\armeabi 下,然后在java里加载一下就好了,这里加进去会被删除,是因为项目设置了NDK-builder,所以每次clean项目,它都会自动编译。把Builder删了不就好了???
最终解决方法:
- 右击Project,选Properties->Builders如下
- 在把高德的本地库拷贝进...\libs\armeabi,clean项目,然后OK了~
推荐链接:http://www.metsky.com/archives/635.html