android jni开发 调用 第三方 动态链接库

来源:互联网 发布:淘宝网卖什么赚钱 编辑:程序博客网 时间:2024/05/18 02:08


在android jni编程时,编译时默认会先清空libs/armeabi目录,所以不能直接把第三方动态库放在libs/armeabi目录中

要解决这个问题:

1. 在jni目录下创建prebuilt子目录(目录名可自定义).

2..将第三方.so放到prebuilt中

  

3. 编写Android.mk文件   

     Android.mk实际上是个轻量级的Makefile.

     用来允许你将源文件组织在一个“module”中,每个Android.mk中可以定义一个或多个modules.  你也可以在多个modules中使用相同的源文件

     写之前先介绍一个简单例子:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := cocos2dLOCAL_MODULE_FILENAME := libcocos2dLOCAL_SRC_FILES := hellocpp/main.cpp \                   ../../Classes/Include/Basic/Player.cpp \   ../../Classes/Include/Basic/Room.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \$(LOCAL_PATH)/../../Classes/Include \$(LOCAL_PATH)/../../Classes/Iwylib include $(BUILD_SHARED_LIBRARY)

   我们来解释下这几行代码:

        1.LOCAL_PATH := $(call my-dir)    : 

           一个Android.mk文件首先必须定义好LOCAL_PATH变量,它用于在开发树中查找源文件。这里 my-dir,由编译系统提供,用于返回当前路径(即包含Andorid.mk文件的 目录)

        2. include $(CLEAR_VARS)    :  

           CLEAR_VARS由编译系统提供,指定让GUN MAKFILE为你清除LOCAL_XXX变量。 

        3 .LOCAL_MODULE := XXX    :

           LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个module。名称必须是唯一的 而且不包含任何空号。注意编译系统会自动产生合适的前缀和后缀。 此处会生成libXXX.so 文件。

        4. LOCAL_MODULE_FILENAME   :

             这个变量是可选的,允许你重新定义生成文件的名称。

        5. LOCAL_SRC_FILES   :

            这个是编译module的源文件列表(例如:.c , .cpp  , .so ....)。这些源文件都是相对于LOCAL_PATH的

        6. LOCAL_C_INCLUDES   :

           当编译所有源代码时(c, c++ )将会添加到包含搜索路径中,

          (这些要放在 LOCAL_CFLAGS / LOCAL_CPPFLAGS 中对应包含的flag的前面)

        7. include $(BUILD_SHARED_LIBRARY)  :

           创建自己的动态链接库



    下面具体讲 如何配置 引用第三方动态链接库 

include $(CLEAR_VARS)  LOCAL_MODULE := crypto      LOCAL_MODULE_FILENAME := libcryptoLOCAL_SRC_FILES := prebuilt/libcrypto.so       LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)

     1. include $(CLEAR_VARS)    在生成每个 module之前都有清除一下变量

     2. LOCAL_SRC_FILES :  所要引起的 动态链接库的 路径,   prebuilt 是自己在jni目录下建的文件夹

     3.LOCAL_EXPORT_C_INCLUDES    获取  .so文件 下的 头文件路径

     4. include $(PREBUILT_SHARED_LIBRARY) 

         指向一个编译脚本,这个脚本用来指向一个预编译动态库。不像BUILD_SHARED_LIBRARY 和 BUILD_STATIC_LIBRARY,       LOCAL_SRC_FILES的值必须是一个

        编译好的动态库的路径(如foo/libfoo.so),而不是源文件。

LOCAL_SHARED_LIBRARY := crypto
     LOCAL_SHARED_LIBRARY     连接第三方库



下面是Android.mk完整配置:  注意 (#-------------------------------)之间的内容

LOCAL_PATH := $(call my-dir)#--------------------------include $(CLEAR_VARS)  LOCAL_MODULE := crypto      LOCAL_MODULE_FILENAME := libcryptoLOCAL_SRC_FILES := prebuilt/libcrypto.so       LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)  LOCAL_MODULE := ssl      LOCAL_MODULE_FILENAME := libsslLOCAL_SRC_FILES := prebuilt/libssl.so       LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY)#--------------------------include $(CLEAR_VARS)LOCAL_MODULE := cocos2dcpp_sharedLOCAL_MODULE_FILENAME := libcocos2dcppLOCAL_SRC_FILES := hellocpp/main.cpp \                   ../../Classes/Include/Basic/Player.cpp \   ../../Classes/Include/Basic/Room.cpp \   ../../Classes/Include/Basic/Task.cpp \   ../../Classes/Iwylib/snappy-c-master/snappy.c \   ../../Classes/Iwylib/http_request.cpp \   ../../Classes/Iwylib/httpwork.cpp \   ../../Classes/Iwylib/login_cache.cpp \   ../../Classes/Iwylib/MsgLayer.cpp \   ../../Classes/Iwylib/ODSocket.cpp \   ../../Classes/Iwylib/rapidjson_util.cpp \   ../../Classes/Iwylib/room_type_info_parse.cpp \   ../../Classes/Iwylib/room_type_info.cpp \   ../../Classes/Iwylib/session_mgr.cpp \   ../../Classes/Iwylib/sock_codec.cpp \   ../../Classes/Iwylib/socket.cpp \   ../../Classes/Iwylib/tcp_socket.cpp \   ../../Classes/Iwylib/tool.cpp      LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \$(LOCAL_PATH)/../../Classes/Include \$(LOCAL_PATH)/../../Classes/Iwylib \$(LOCAL_PATH)/../../Classes/Modules \$(LOCAL_PATH)/../../Classes/Modules/Network \$(LOCAL_PATH)/../../Classes/Modules/room_sel LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_staticLOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static LOCAL_WHOLE_STATIC_LIBRARIES += cocosbuilder_static LOCAL_WHOLE_STATIC_LIBRARIES += spine_static LOCAL_WHOLE_STATIC_LIBRARIES += cocostudio_static LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static#--------------------------LOCAL_SHARED_LIBRARY := crypto LOCAL_SHARED_LIBRARY := ssl#---------------------------include $(BUILD_SHARED_LIBRARY)$(call import-module,.)$(call import-module,audio/android) $(call import-module,Box2D) $(call import-module,editor-support/cocosbuilder) $(call import-module,editor-support/spine) $(call import-module,editor-support/cocostudio) $(call import-module,network) $(call import-module,extensions)



 



0 0
原创粉丝点击