http://blog.csdn.net/andyhuabing/article/details/7492755
这一篇引自于如下的问题而生.
如何使用NDK编译工程代码,既包含java也包含native(c++)代码
有如下几个问题:
1、编译mips体系结构代码?默认的android是在ARM上开发
2、需要引用平台的头文件及android系统头文件如何做?
3、如何加入平台库,保证代码link成功?
下面就上面提到的三个问题一一进行解决
问题解决:
1、编译mips体系结构代码?默认的android是在ARM上开发
对于mips平台,首先需要下载ndk,其版本:android-ndk-r8
下载路径: http://developer.android.com/sdk/ndk/index.html 点击 android-ndk-r8-windows.zip 下载即可
搭建NDK编译环境:
a. 为NDK工程添加Builder
选择相应的 Project ,点击右键 选择 Properties ,在窗口里选择Builders ,点"New..."按钮,新增一个“Android NDK Builder”编译配置:
b. 配置相应的参数:
在Main tab页面里
Location 栏 选择 你安装Cygewin时配置的bin目录下的 bash.exe 所在路径,以下是我的安装路径:
c:\cygwin\bin\bash.exe
在Working Directory 里配置路径为 bin目录的路径
c:\cygwin\bin\
Arguments的配置:
--login -c "cd '${project_loc}' && $NDK/ndk-build " [这里使用project_loc变量,对于不同的工程可以直接拷贝使用]
以上参数表示: 首先登陆 Cygwin , 然后进入当前这个工程下的jni 目录(该目录下存放 c或c++的文件和 Android.mk)
最后执行 “ndk-build” 命令 执行编译。
c. $NDK环境变量还没有设置,如下图进行设定:
配置Android NDK 的存放路径,这样builder才能找到相应的编译器,库等文件。
我的NDK是存在C:\NDK\android-ndk-r8-windows\android-ndk-r8
到这里,就配置完毕了。可以开始编译jni库程序或native 应用了
对于mips平台,这个需要修改一个配置文件:
进入NDK的路径,其编译工具链如下:
\android-ndk-r8\toolchains\mipsel-linux-android-4.4.3
这里修改一下config.mk 文件
#modify before
#TOOLCHAIN_ARCH := mips
#TOOLCHAIN_ABIS := mips
#modify after
TOOLCHAIN_ARCH := mips
TOOLCHAIN_ABIS := mipso32
与ARM下面的文件对比一下:
路径: android-ndk-r8\toolchains\arm-linux-androideabi-4.4.3
其config.mk内容如下:
TOOLCHAIN_ARCH := arm
TOOLCHAIN_ABIS := armeabi armeabi-v7a
2、需要引用平台的头文件及android系统头文件如何做?
a、需要在平台上使用android系统中将所有头文件取出,按照android的目录结构完全一致
b、从平台SDK中获取到所有的平台相关头文件
这里将所有的头文件全部放在 dev-bcm7231-headers
其中目录结构如下:
那么如何引用这些头文件呢?
jni/android.mk 中引用
# 配置android头文件的根目录
ANDROID_INCLUDE_TOP := /cygdrive/d/btools/workspace/dev-bcm7231-headers
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/porting/include \
$(LOCAL_PATH)/porting/inc \
$(ANDROID_INCLUDE_TOP)/dalvik/libnativehelper/include \
$(ANDROID_INCLUDE_TOP)/frameworks/base/include \
$(ANDROID_INCLUDE_TOP)/system/core/include \
$(ANDROID_INCLUDE_TOP)/hardware/libhardware/include \
$(ANDROID_INCLUDE_TOP)/external/skia/include \
$(ANDROID_INCLUDE_TOP)/frameworks/base/native/include \
$(ANDROID_INCLUDE_TOP)/frameworks/base/opengl/include\
$(ANDROID_INCLUDE_TOP)/hardware/libdtv/libcommon \
$(ANDROID_INCLUDE_TOP)/vendor/broadcom/bcm7231/brcm_nexus/bin/include \
ok,这里将android的头文件及平台头文件都包含进去了
3、如何加入平台库或android的第三方动态库,保证代码link成功?
首先在服务器上编译得到这些相关库,然后才能将其库放置于windows的eclipse编译环境中
对于mips平台放置路径:(工程的根目录)
\obj\local\mipso32 下面,如我就放在 lib_ipanel_BCM97231.a 库
对于arm平台放置路径:(工程的根目录)
obj\local\armeabi 下面
何时会使用或link这些库呢?
jni/android.mk 文件中需要加入:
LOCAL_SHARED_LIBRARIES := ...
LOCAL_STATIC_LIBRARIES := ...
还有一种加入动态库的方式:
在 JNI 下面建立目录: android/lib 放入引用的动态库:
LOCAL_PATH_SMALL = $(shell echo $(LOCAL_PATH) | tr A-Z a-z)
CYGDRIVE_FLAG = $(shell echo $(LOCAL_PATH_SMALL) | grep -c '/cygdrive')
ifeq ($(CYGDRIVE_FLAG), 0)
LOCAL_PATH_WINDOWNS = $(LOCAL_PATH_SMALL)
else
LOCAL_PATH_DRIVE = $(shell echo $(LOCAL_PATH_SMALL) |cut -d '/' -f 3)
LOCAL_PATH_SHARE = $(shell echo $(LOCAL_PATH_SMALL) |cut -d '/' -f 4-)
LOCAL_PATH_WINDOWNS = $(shell echo $(LOCAL_PATH_DRIVE):/$(LOCAL_PATH_SHARE))
endif
LOCAL_LDLIBS := -L"$(LOCAL_PATH_WINDOWNS)/android/lib" \
-llog -lnativehelper -lsurfaceflinger_client \
-lskia -lcutils -lui -landroid_runtime \
在这里link这些动态库文件
动态库还有一种添加方法:
直接将动态库拷到如下目录下:
ANDROID_NDK_ROOT\platforms\android-xx\arch-arm\usr\lib
这里的xx与版本相关,请参考编译apk根目录下project.properties:
# Project target.
target=android-9
如此则加入到 android-9\arch-arm\usr\lib 下面
对于静态库的引用方法:
#static lib module
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := porting/lib/lib_test.a
include $(PREBUILT_STATIC_LIBRARY)
引用link时使用:
LOCAL_STATIC_LIBRARIES := test