Android ndk移植c库libpng

来源:互联网 发布:喷绘布制作软件 编辑:程序博客网 时间:2024/05/17 06:18

http://www.16kan.com/post/167030.html

 

Android ndk移植c库libpng

很久没写blog了。还是不太习惯写博客而且很麻烦的登录找到51cto。要是51cto能有个自己的win32应用直接可以连接或许我就能常常进来了。

这篇博文是为了我2个月前在51cto上问的一个问题。问题连接为。

http://bbs.51cto.com/viewthread.php?tid=932324&pid=4857967&page=1&extra=#pid4857967

因为长久都没有人回答。以及我自己做的一个回答回过头才知道是错误的。因此写这篇博客来说一下。希望不要误导他人。

(此方法虽然说是libpng 的移植但是了解了之后其他的c/c++库的移植应该也就会了。)

1.到libpng的官网上download自己相应的平台libpng的库.然后解压。
2.查看makefile文件的内容。创建一个文件夹 查看makefile文件里面编译成库必须包含的文件copy到该文件里面在这里我文件名取名为png。

以下是libpng1510的makefile文件中比较全的说了包含所有编译libpng库需要的文件的语句。

OBJS =  png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \
pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \
pngwtran.o pngmem.o pngerror.o pngpread.o

(.o文件是编译生成链接库必要的中间文件)

3.1(这里有多种方法。3.1代表3步的第1种方法。)单独编译成so文件或.a文件(动态或静态链接库文件)然后移植到项目。该方法具体写法可以参考ndk里面docs文件夹下的ANDROID-MK.html的文档。

3.1.1(3.1代表3步的第1种方法的第一步。):你可以建立一个jni文件夹然后把刚才的png文件夹扔到jni文件夹里面然后再创建一个.mk文件。内容如下

静态

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE :=png
LOCAL_SRC_FILES := png/png.c png/pngset.c png/pngget.c png/pngrutil.c png/pngtrans.c png/pngwutil.c \
png/pngread.c png/pngrio.c png/pngwio.c png/pngwrite.c png/pngrtran.c \
png/pngwtran.c png/pngmem.c png/pngerror.c png/pngpread.c
include $(BUILD_STATIC_LIBRARY)

动态

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE :=png
LOCAL_SRC_FILES :=  png/png.c png/pngset.c png/pngget.c png/pngrutil.c png/pngtrans.c png/pngwutil.c \
png/pngread.c png/pngrio.c png/pngwio.c png/pngwrite.c png/pngrtran.c \
png/pngwtran.c png/pngmem.c png/pngerror.c png/pngpread.c
include $(BUILD_SHARED_LIBRARY)

(当然你可以直接去掉把里面的文件放在jni下面就不需要夹png/了)

3.1.2:如果你解压好了ndk那么把ndk的目录加入环境变量之后那么你就可以CD进入jni所在的上一层目录。进行ndk-build了。这时候在你的新生成的libs和obj文件夹里面就可以得到你想要的链接库了。(如果你是用的是静态的那么libs文件夹里面是不会有的。因为libs文件夹里面的东西将来会直接打包到apk的。而静态链接库不会自动打包到里面只能以动态库打包进去。)

3.1.3:好了得到了链接库之后你就可以到你的ndk项目里面使用了!这时候你需要把你的动态链接库直接复制到你的项目的jni文件夹下面。然后在里面编写以下这样的类似的mk文件:

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)
        LOCAL_MODULE := png
        LOCAL_SRC_FILES := libpng.so
        #include $(BUILD_STATIC_LIBRARY)  #如果是使用静态的库把这句include前的#去掉

        #include $(BUILD_SHARED_LIBRARY) #如果是使用动态的库把这句include前的#去掉

        include $(CLEAR_VARS)
        LOCAL_MODULE := ourproject
        LOCAL_SRC_FILES := ourproject.c
        #LOCAL_STATIC_LIBRARIES := libpng #如果是使用静态的库把这句include前的#去掉

        #LOCAL_SHARED_LIBRARIES := libpng   #如果是使用动态的库把这句include前的#去掉

        include $(BUILD_SHARED_LIBRARY)

编写好之后你就可以CD到你项目路径然后ndk-build了。在你的 ourproject.c
文件里面试着写一下png库的调用。

3.2:好的这是第2种方式。你并不需要先拥有动态链接库,只需要按照如下的步骤来。

3.2.1直接把png文件夹copy到你的项目的jni文件夹下。然后直接编写如下的mk文件。

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := png
LOCAL_SRC_FILES := png/png.c png/pngset.c png/pngget.c png/pngrutil.c png/pngtrans.c png/pngwutil.c \
png/pngread.c png/pngrio.c png/pngwio.c png/pngwrite.c png/pngrtran.c \
png/pngwtran.c png/pngmem.c png/pngerror.c png/pngpread.c
#include $(BUILD_STATIC_LIBRARY) #如果是使用静态的库把这句include前的#去掉

#include $(BUILD_SHARED_LIBRARY) #如果是使用动态的库把这句include前的#去掉

include $(CLEAR_VARS)
LOCAL_MODULE := ourproject
LOCAL_SRC_FILES := ourproject.c
#LOCAL_STATIC_LIBRARIES := libpng #如果是使用静态的库把这句include前的#去掉

#LOCAL_SHARED_LIBRARIES := libpng #如果是使用动态的库把这句include前的#去掉

include $(BUILD_SHARED_LIBRARY)

3.2.2然后再和3.1.3步骤一样cd到项目目录进行ndk-build了。

学会了写mk文件那么你编译其他的库应该就没什么大问题了。

(ps:写这篇文章因为时间原因没有一步一步的来检验仅仅凭借记忆和手打写的代码。如果有人参考出现问题。可以提出。我会修正。当然明天我将会重新验证一下)

 

原创粉丝点击