Linux下使用NDK进行so库的编译和生成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiantanlong/article/details/80901193

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

八、总结

小试牛刀,有不对的地方欢迎指正哈。有说的不清楚的地方,可以留言交流。

猜你喜欢

转载自blog.csdn.net/qiantanlong/article/details/80901193