sueZheng
项目背景:前期自己编写过一个本地库(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 :=amapv302
LOCAL_SRC_FILES :=prebuilt/amapv302.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := amapv302ex
LOCAL_MODULE :=amapv302ex
LOCAL_SRC_FILES :=prebuilt/amapv302ex.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
 
 
#自己写的.so库
include ../../sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := detection_based_tracker
include $(BUILD_SHARED_LIBRARY) 
但是这样生成的仅仅的文件没有lib前缀,程序运行后报错无法加载amapv302.so
如图:
 

方法二:

#编译第三方.so本地库
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := amapv302
LOCAL_MODULE :=amapv302
LOCAL_SRC_FILES :=prebuilt/libamapv302.so
include $(PREBUILT_SHARED_LIBRARY)
#
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := amapv302ex
LOCAL_MODULE :=amapv302ex
LOCAL_SRC_FILES :=prebuilt/libamapv302ex.so
include $(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 :=amapv302ex 
LOCAL_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

 

分类:

技术点:

相关文章:

  • 2021-04-19
  • 2021-12-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-14
  • 2021-08-01
猜你喜欢
  • 2021-12-05
  • 2021-11-05
  • 2022-12-23
  • 2021-09-05
  • 2022-01-06
  • 2021-10-10
  • 2021-06-09
相关资源
相似解决方案