NDK的开发因为涉及到C/C++语言而让很多人感觉到难以捉摸,又涉及到Linux系统下的编译,更让很多人望而却步,但是,作为有理想的安卓开发人员,作为有理想的安卓开发人员,作为有理想的安卓开发人员,重要的事说三遍,为了理想还是要啃下这块硬骨头的,而且碰钉子是肯定的,一定要坚持啊。
一、Linux下安装NDK
下载NDK r17 https://developer.android.google.cn/ndk/downloads/
下载完成后解压到合适的目录下
二、配置NDK 的环境
1、Ctrl+Alt+T 打开命令行窗口
2、运行命令行执行sudogedit /etc/profile
在文档的结尾增加
#setNDK env
NDKROOT=/home/zhen/Downloads/ndk/android-ndk-r17b
export PATH=$NDKROOT:$PATH
3、重启电脑,在命令行窗口验证NDK 环境配置是否正确,输入ndk-build,出现下面的界面表示配置正确。
三、编译、生产SO库文件
1、在合适的目录下新建jni目录,在jni目录下新建Android.mk和Application.mk两个文件,具体参数配置可以参考资料。在jni目录下放置需要编译的C/C++源代码和相关头文件,编译器会自动找到关联的头文件,无需设置头文件的目录,源文件和头文件的相对目录可以编译就可以。
2、打开命令窗口,cd 到jni所在的目录,执行ndk-build命令,就可以进行编译、生产so文件了。
3、完成后,会生成libs和obj两个目录,libs下放置生成的so文件。
四、测试用到的Java的代码
package com.hongzhen.myndklibrary;
public class NDKTest {
static {
System.loadLibrary("Native");
}
public static native String testNDK();
}
五、native-lib.cpp代码
#include <jni.h>
#include <string>
extern "C" {
JNIEXPORT jstring JNICALL
Java_com_hongzhen_myndklibrary_NDKTest_testNDK(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
}
六、Android.mk代码
LOCAL_PATH := $(call my-dir)
TARGET_ARCH := arm
TARGET_PLATFORM := android-14
include $(CLEAR_VARS)
LOCAL_CFLAGS += -D__linux__ -D__embedded__ -D__android__ -W -Wall
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../include
LOCAL_MODULE := libNative
//LOCAL_MODULE_FILENAME := libNative
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -llog
LOCAL_LDFLAGS += -ljnigraphics
//LOCAL_LDFLAGS += $(LOCAL_PATH)/iconv/libiconv.a
include $(BUILD_SHARED_LIBRARY)
$(call import-module, android/support)
七、Application.mk代码
APP_MODULES = libNative
//APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64
APP_ABI := armeabi-v7a arm64-v8a
//APP_STL := stlport_shared
APP_STL := stlport_static
//APP_STL := gnustl_static
ifeq ($(NDK_DEBUG), 1)
APP_OPTIM = debug
APP_CFLAGS = -g -O0
else
APP_OPTIM = release
APP_CFLAGS = -O3
endif
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++0x
APP_CPPFLAGS += -fexceptions
八、总结
小试牛刀,有不对的地方欢迎指正哈。有说的不清楚的地方,可以留言交流。