zoukankan      html  css  js  c++  java
  • 【转】NDK上建立自己的项目

    原文网址:http://www.cnblogs.com/sardine/archive/2011/07/30/2121845.html

    建立Android.mk文件

    ~/android-ndk/apps/project_test/project/jni $gvim Android.mk


    #### Android.mk #####
    # 进入当前目录并取得当前目录的路径
    # 其结果为: ~/android-ndk/apps/project_test/project/jni

    LOCAL_PATH:= $(call my-dir)

    # 清除全局变量
    include $(CLEAR_VARS)

    # 项目需要编译源文件列表
    LOCAL_SRC_FILES:=
    main.cpp

    # 项目需要的.h头文件目录列表
    LOCAL_CFLAGS := 

    # 项目需要的链接自编译出的.so 文件列表
    LOCAL_SHARED_LIBRARIES :=

    # 项目需要的链接非自编译出的.so 文件目录及列表
    LOCAL_LDLIBS :=

    # 在执行此Android.mk 文件时,显示指定的变量信息
    # 此次则显示 LOCAL_SRC_FILE变量内容在控制台上
    $(info $(LOCAL_SRC_FILES))

    # 项目编译出输文件名
    LOCAL_MODULE:= main

    # 项目编译出输文件名,编译成哪种文件,
    # BUILD_EXECUTABLE 是指.bin二进制执行文件
    # BUILD_SHARED_LIBRARY 是指.so 动态库文件
    # BUILD_STATIC_LIBRARY 是指.a 静态库文件
    # 这里我们是生成二进制执行文件
    include $(BUILD_EXECUTABLE)


    3) 在java源码项目目录,
    android-ndk/apps/project_test/project/src


    创建文件 default.properties
    android-ndk/apps/project_test/project $gvim default.properties
    #### default.properties ####
    target=android-4

    创建文件Application.mk
    android-ndk/apps/project_test/ $gvim Application.mk
    #### Application.mk ####
    APP_PROJECT_PATH := $(call my-dir)
    APP_MODULES := main

    4)编译project_test项目

    ~/android-ndk $make APP=project_test

    5)输出查看
    在apps/project_test/project/libs 目录里会有生成的 main.bin 文件


    2.安装到android SDK中测试。
    启动emulator模拟器
     $./emulator

    修改system目录的属性为可读写
     $./adb remount

    push到指定的目录
     $./adb push /out/system-bin/main.bin  /system/bin

    运行:
     $./adb shell
    # chmod 777 /system/bin/main.bin
    # /system/bin/main.bin

    便可看到输出结果:test project OK!

    -------------------------------------------------------------------

    在原有的project_test 项目中添加 SO 子项目

    之前的 project_test 项目 请看<在NDK上建立第一个自己的项目>文档,在此主要描述如何增加自己的 SO项目。
    1. 建立自己SO的子项目。
    1) 先在项目project_test目录中新建子项目目录,如: libtest 目录
    ~/android-ndk/apps/project_test/project/jni $mkdir libtest

    2) 进入项目目录新建C++ lib源码文件,如: libtest.cpp
    ~/android-ndk/apps/project_test/project/jni $cd libtest
    ~/android-ndk/apps/project_test/project/jni/libtest $gvim libtest.cpp
    /*--- libtest.cpp ---*/
    // libtest.cpp
    #include <stdio.h>

    void printlibtest()
    {
    printf("libtest project OK! ");
    }

    3) 建立头文件如: libtest.h
    ~/android-ndk/apps/project_test/project/jni/libtest $gvim libtest.h
    /*--- libtest.h ---*/
    // libtest.h
    #ifndef GUILH_LIB_TEST_H 
    #define GUILH_LIB_TEST_H

    void printlibtest();

    #endif

    建立android-ndk/apps/project_test/project/jni/libtest/Android.mk文件
    ~/android-ndk/apps/project_test/project/jni/libtest $gvim Android.mk
    ### android-ndk/apps/project_test/project/jni/libtest/Android.mk ###
    # 进入当前目录并取得当前目录的路径
    LOCAL_PATH:= $(call my-dir)

    # 清除NDK全局变量
    include $(CLEAR_VARS)

    # 项目需要编译源文件列表
    LOCAL_SRC_FILES:=
    libtest.cpp

    # 项目需要的.h头文件目录列表
    LOCAL_CFLAGS :=

    # 项目需要的链接自编译出的.so 文件列表
    LOCAL_SHARED_LIBRARIES :=

    # 项目需要的链接非自编译出的.so 文件目录及列表
    LOCAL_LDLIBS :=

    # 在执行此Android.mk 文件时,显示指定的变量信息, 如无需显示则可在之前加“#”符号
    # 此次则显示 LOCAL_SRC_FILE变量内容在控制台上
    $(info $(LOCAL_SRC_FILES))

    # 项目编译出输文件名
    LOCAL_MODULE:= libtest

    # 项目编译出输文件名,编译成哪种文件,
    # BUILD_EXECUTABLE 是指.bin二进制执行文件
    # BUILD_SHARED_LIBRARY 是指.so 动态库文件
    # BUILD_STATIC_LIBRARY 是指.a 静态库文件
    # 这里我们是生成动态库文件
    include $( BUILD_SHARED_LIBRARY)

    2. 修改原project_test 项目与 SO子项目进行连接
    1) 进入test子项目目录修改C++源码文件,如: main.cpp
    ~/android-ndk/apps/project_test/project/jni $cd ../test

    ~/android-ndk/apps/project_test/project/jni/test $gvim main.cpp
    /*--- main.cpp ---*/
    // main.cpp
    #include <lib/libtest.h>
    int main()
    {
    printlibtest();
    return 0;
    }

    2) 修改sources/project_test/test/Android.mk文件
    ~/android-ndk/apps/project_test/project/jni/test $gvim Android.mk
    ### sources/project_test/test/Android.mk ###
    # 进入当前目录并取得当前目录的路径
    LOCAL_PATH:= $(call my-dir)

    # 清除NDK全局变量
    include $(CLEAR_VARS)

    # 项目需要编译源文件列表
    LOCAL_SRC_FILES:=
    main.cpp

    # 项目需要的.h头文件目录列表
    LOCAL_CFLAGS :=
    -I$(LOCAL_PROJECT_PATH)

    # 项目需要的链接自编译出的.so 文件列表
    LOCAL_SHARED_LIBRARIES :=
    libtset

    # 项目需要的链接非自编译出的.so 文件目录及列表
    LOCAL_LDLIBS :=

    # 在执行此Android.mk 文件时,显示指定的变量信息, 如无需显示则可在之前加“#”符号
    # 此次则显示 LOCAL_SRC_FILE变量内容在控制台上
    $(info $(LOCAL_SRC_FILES))

    # 项目编译出输文件名
    LOCAL_MODULE:= main

    # 项目编译出输文件名,编译成哪种文件,
    # BUILD_EXECUTABLE 是指.bin二进制执行文件
    # BUILD_SHARED_LIBRARY 是指.so 动态库文件
    # BUILD_STATIC_LIBRARY 是指.a 静态库文件
    # 这里我们是生成动态库文件
    include $( BUILD_EXECUTABLE)



    3) 修改文件apps/project_test/Application.mk
     $gvim Application.mk
    ### apps/project_test/Application.mk ###
    APP_PROJECT_PATH := $(call my-dir)
    APP_MODULES := gmain.bin libtest


    3. 编译project_test项目
    ~/android-ndk $make APP=project_test

    输出查看
    在~/android-ndk/apps/project_test/project/libs 目录里会有生成的main.bin与libtest.so文件

    4. 安装到android SDK中测试。
    启动emulator模拟器
    $./emulator

    修改system目录的属性为可读写
     $./adb remount

    push到指定的目录
     $./adb push /out/system-bin/gmain.bin  /system/bin
     $./adb push /out/system-lib/libtest.so  /system/lib

    运行:
     $./adb shell
    # chmod 777 /system/bin/main.bin
    # /system/bin/main.bin

    便可看到输出结果:libtest project OK!

  • 相关阅读:
    转:va_list、va_start、va_arg、va_end的原理与使用
    学习Docker的记录
    Google Code 优秀的开源工具
    转载(程序在内存中运行的奥秘)
    C# 和 Java 之争之我见
    揭秘ASP.NET 2.0的Eval方法(转)
    IIS6.0 架构(二)
    IE6 position:fixed bug (固定窗口方法)(转载)
    用FileStream上传图片转换成二进制,在本地用行,传到服务器上去出现如下错误
    异常处理
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4308569.html
Copyright © 2011-2022 走看看