我的是直接放进armeabi文件夹里的,没遇到过被删除的情况

解决方案 »

  1.   

    呵呵,楼主距答案已经很近了,你prebuilt是对的,但是整个过程有点乱,这个工程只需要有一个Android.mk就行了:将prebuilt下的Android.mk删掉,因为这个文件没有必要,然后在jni下创建一个Android.mk(一般工程都是这样的,jni下一个Android.mk),然后将你prebuilt的代码添加到mk文件的最开头,但是要改变一下目录:LOCAL_SRC_FILES := prebuilt/liblocSDK3.so,然后再改一处就行了:
    LOCAL_SHARED_LIBRARIES := prebuilt/locSDK3 改为
    LOCAL_SHARED_LIBRARIES := locSDK3
    这个时候你编译,肯定能通过,我是做过实际项目的
    你觉得文件变小了我不太清楚是为什么,因为我从来没有碰到这样的情况,不过我建议你先按我的方法试试,如果还变小,就有问题了
      

  2.   

    直接将locSDK3.SO拷进去就行了,android.mk之中不做任何修改,因为.mk是编译时用到的,相当于一个索引,用于指定编译哪些c文件,进而生成so文件,而既然是.so,说明文件已经编译过了,不需要再编译的,至于为什么会变小,是因为在.mk文件中指定了编译一个locSDK3.SO,编译时就会将现有的同名so删除,重新编译生成,而jni可能中没有任何对应c文件或者你没有指定编译哪些文件,所以文件so中几乎没有实际数据
      

  3.   

    用百度locSDK3做DEMO,我有成功。但是实际添加到项目里。就碰到这个问题了。
      

  4.   

    不要误导人好不好,你要引用三方库,不改.mk怎么用三方库,如果他写的.c文件里有要用到三方库的接口,编译时直接就报错。还有,有没有同名关键要看楼主是否生成的.so和三方库的名字同名
      

  5.   

    我没有文件要和locSDK3.SO同名的。也没有文件和locSDK3.SO是同名的。
      

  6.   

    2楼和3楼的神,我也觉得5K的locSDK3.SO是重新生成的。按照二楼的神的指点还是重新生成一个locSDK3.SO。
      

  7.   

    LOCAL_PATH:=$(call my-dir)
         include $(CLEAR_VARS)
      
         LOCAL_MODULE := locSDK3
         LOCAL_SRC_FILES := prebuilt/liblocSDK3.so
         include $(PREBUILT_SHARED_LIBRARY) 
         
    #######################################################
    include $(CLEAR_VARS)
    #here we give our modules name and source file(s)LOCAL_MODULE :=aaa
    LOCAL_SRC_FILES :=aaa.c
    include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)
    #here we give our modules name and source file(s)LOCAL_MODULE :=aaaInit
    LOCAL_SRC_FILES :=aaaInit.c
    include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)
    #here we give our modules name and source file(s)LOCAL_MODULE :=aaaMainActivity
    LOCAL_SRC_FILES :=aaaMainActivity.c
    include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)
    #here we give our modules name and source file(s)LOCAL_MODULE :=aaaMailService
    LOCAL_SRC_FILES :=aaaMailservice.c
    include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)
    #here we give our modules name and source file(s)LOCAL_MODULE :=aaaMail
    LOCAL_SRC_FILES :=aaaMail.c
    include $(BUILD_SHARED_LIBRARY)
    #############################################################
    include $(CLEAR_VARS)
    LOCAL_SHARED_LIBRARIES := locSDK3上面是jni目录下android.mk文件的内容,还是重新生成locSDK3.so。所以只有5K。
      

  8.   

    首先给楼主说下啊,不是重新生成,是安装,这个动作是因为prebuilt产生的,因为这个库你将来c和java代码会用到,所以才会install
    但是看了楼主的这个.mk文件,发现你好像并没有使用locSDK3.so这个三方库啊?
    LOCAL_SHARED_LIBRARIES := locSDK3这句话表示的就是你要引用的三方库的声明,但是你在前面已经用include $(CLEAR_VARS)清除变量了啊,又是一个单独的模块了
    总之,我看了你的这个文件,只知道你生成了libaaa.so三个库,并没有发现你调用三方库
      

  9.   

    请教lsk0372,那正确的android.mk该如何写啊
      

  10.   

    这样,我给你给网址你看看,不会的话继续找我,放心,这个简单,只是个脚本而已
    http://blog.csdn.net/zhandoushi1982/article/details/5316669
      

  11.   

    我用的土办法,我生成了自己SO文件之后,就把ECLIPSE设置为不自动编译SO文件,再把第三方的SO文件加进来
      

  12.   

    eclipse怎么会生成so文件呢?so文件是用gcc(linux系统用)和ndk-build(android系统用)编译生成的,eclipse默认是用jdk编译的
      

  13.   

    回复16楼,你的项目里有自己的其他SO文件吗,SO是自动编译的吗?当然也许是我有地方要改善。搞不懂的为何会删除liblocSDK3.so 。其实我开始的时候,就是直接COPY进armeabi文件夹的,但是被删除了,迫不得已才改MK文件的。因为我在DEMO里都不用MK文件的,只需要直接COPY进ARMEBI。
      

  14.   

    如果直接考进去,不想被删除,就去掉下面的代码:
        include $(CLEAR_VARS)
     
        LOCAL_MODULE := locSDK3
        LOCAL_SRC_FILES := liblocSDK3.so
        include $(PREBUILT_SHARED_LIBRARY
    这个是重新生成的
      

  15.   

    lsk0372,对于您的帮助之处,打心眼感激。言语如有不敬之处,望能谅解。
      

  16.   

    看起来似乎是搞定了。不用另外生成MK,第三方的SO文件COPY到JNI目录。然后在JNI目录的MK文件的末尾添加include $(CLEAR_VARS)
    LOCAL_MODULE := locSDK3
    LOCAL_SRC_FILES := locSDK3.so
    include $(PREBUILT_SHARED_LIBRARY)。
    我之前因为把liblocSDK3.so COPY到JNI目录而不是locSDK3.so。所以报找不到文件。感谢lsk0372,tf110012 以及各位的指点。
      

  17.   

    请问能将最后的Android.mk文件内容贴出来吗?
      

  18.   

    我的项目中自身会生成一个so文件 还需要添加两个第三方so文件 直接复制进去项目会自动删除拿两个文件 我通过修改mk文件 so文件保存进去了 但是程序运行的时候会报so文件找不到楼主大人能不能帮忙解答一下
      

  19.   

    靠,必须要回复一下了,不然不足以平复我兴奋的心情,终于TMD搞定了,一下午加一晚上疯狂的查搜各种资料。这个帖子是我早期发现的一个非常靠谱的贴,无奈实在是安卓小白,刚接触一星期,之前在VS下开发,移植到xcode,实在看不懂mk里面的东西。
    网上最多的答案是在jni下新建prebuilt文件夹,将so文件copy进入,在新建一Android.mk里面内容
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := xxx
    LOCAL_SRC_FILES := xxx.so
    include $(PREBUILT_SHARED_LIBRARY)
    然后在外面,就是JNI目录下的Android.mk中添加
    LOCAL_SHARED_LIBRARIES := xxx  (xxx就是上个mk中的LOCAL_MODULE)
    然后在最后加上
    include $(LOCAL_PATH)/prebuilt/Android.mk
    修改完毕,运行,编译不过。比较白,看不懂报错信息。
    几番折腾下,决定按楼主的解决方案,so直接放在jni下,即与Android.mk在同一路径。
    又一番折腾,还是编译报错,除非我把最后一句include $(PREBUILT_SHARED_LIBRARY)改成include $(BUILT_SHARED_LIBRARY)。可以编译过,但so严重缩水,变成5K。又换回前一种方法,仔细看报错,好像是路径问题,发觉我的mk中有这么俩句
    $(call import-add-path, E:/cocos2d-x-2.2)\
    $(call import-add-path, E:/cocos2d-x-2.2/cocos2dx/platform/third_party/android/prebuilt)\
    就是这两句,改变了LOCAL_PATH的值
    在使用include $(LOCAL_PATH)/prebuilt/Android.mk时,找不到路径。
    同时 LOCAL_SHARED_LIBRARIES := XXX 这句应该包含在
    include $(CLEAR_VARS)
    LOCAL_SHARED_LIBRARIES := xxx
    include $(PREBUILD_SHARED_LIBRARY)终于完成,完美拷贝到armeabi文件夹下。
    至于楼主的解决方案,我又试了下,还是没成功,不知道问题在哪,时间紧张,暂时没精力再弄
      

  20.   

    请教各位,我想引用一个图片处理库,文件名libfreeimage.so,我将文件直接放到jni目录下,这是Android.mk,但是编译有错误,请教各位出了什么问题。
    #Android.mk
    LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE :=GISView
    LOCAL_CFLAGS    :=-Werror
    LOCAL_C_INCLUDES:=$(LOCAL_PATH) /jni
    LOCAL_C_INCLUDES +=$(LOCAL_PATH) ../android-ndk-r9/sources/cxx-stl/stlport
    LOCAL_SRC_FILES := com_example_test_GisGlobeLib.cpp \
                       RenderingEngine.TexturedES2.cpp \
                       TileSet.cpp \
                       Tile.cpp \
                       Camera.cpp \
                       Task.cpp                                                      
    LOCAL_LDLIBS :=-llog -lGLESv2 -L$(SYSROOT)/usr/lib 
    #LOCAL_SHARED_LIBRARIES := freeimage
    include $(BUILD_SHARED_LIBRARY)include $(CLEAR_VARS)
    LOCAL_MODULE := freeimage
    LOCAL_SRC_FILES := libfreeimage-3.15.4.so
    include $(PREBUILT_SHARED_LIBRARY)
      

  21.   

    LOCAL_PATH := $(call my-dir)
     
    include $(CLEAR_VARS)
      
    LOCAL_MODULE    := txpay
    LOCAL_SRC_FILES := prebuilt/$(TARGET_ARCH_ABI)/libtxpay.so
    include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS) 
    LOCAL_MODULE := game_shared
     
    LOCAL_MODULE_FILENAME := libgame
     
    #traverse all the directory and subdirectory
    define walk
      $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))
    endef
     
    #traverse Classes Directory
    ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes)
     
    FILE_LIST := hellocpp/main.cpp
    FILE_LIST += $(LOCAL_PATH)/../../Classes/sql/sqlite3.c
    FILE_LIST += $(filter %.cpp, $(ALLFILES))
     
    FILE_INCLUDES := $(shell find $(LOCAL_PATH)/../../Classes -type d)
     
    #source file will be compiled
    LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
     
                       
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../external/Box2D/ \
    $(FILE_INCLUDES) \
     
    LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static box2d_staticinclude $(BUILD_SHARED_LIBRARY) 
    $(call import-module,CocosDenshion/android) \
    $(call import-module,cocos2dx) \
    $(call import-module,extensions) \
    $(call import-module,external/Box2D)
    贴个昨天弄的吧,花了半天时间折腾,结果发现不用多个mk,一个就行,只需添加3-7行处的代码就可以了,而且要放最前面,放后面不行
    prebuilt/$(TARGET_ARCH_ABI)中的prebuilt就是jni里新建的prebuilt文件,其实建不建无所谓,prebuilt里面有4个文件夹:armeabi、armeabi-v7a、mips、x86,每个文件夹里放着不同架构的libtxpay.so库, $(TARGET_ARCH_ABI)则是按cpu架构自动选择armeabi、armeabi-v7a、mips、x86这些架构中的库,我的测试是默认只复制armeabi中的libtxpay.so库,在application.mk中添加APP_ABI := armeabi armeabi-v7a后,则会同时复制armeabi armeabi-v7a的库发现这方面网上搜出来的大部分都是同样的内容,说得也不是很清楚,所以把自己的收获也贴出来难得回复