在NDK上建立自己的项目
建立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!\n");
}
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!