上一篇文章大概讲了android-NDK的使用手册,网地址如下:
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


更多相关文章

  1. android中URI简介
  2. MAC环境Android(安卓)SDK环境变量配置20180715
  3. Android开发工程师(高薪急聘)
  4. Window平台下的Android的环境配置
  5. Android(安卓)studio 1.3 NDK开发
  6. android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图
  7. 配置android的开发环境
  8. Visual Studio 跨平台开发实战(5) - Xamarin Android(安卓)多页
  9. Android安装配置注意

随机推荐

  1. android之监听手机来电状态
  2. Linux ubuntu14.04 LTS 配置 android stu
  3. android apk 升级代码
  4. 如何在Mac/Linux上设置android环境变量
  5. Android(安卓)进入后台触发的事件,一般用
  6. android app widget,安卓桌面小工具的使
  7. Java 软引用及在Android中的应用
  8. Android之混淆心得与亲身体验
  9. android从web应用读取xml和json数据实战
  10. android 三种Service