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

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

八、总结

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

  • 1
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我可以回答你关于在 Linux NDK 中交叉编译 SO 的问题。 在交叉编译 SO 之前,你需要先设置交叉编译环境。你可以使用以下命令来设置交叉编译环境: ``` ndk-build APP_ABI=armeabi-v7a NDK_TOOLCHAIN_VERSION=clang ``` 在这个命令中,`APP_ABI` 变量用来指定你要交叉编译的 ABI,这里我们选择了 `armeabi-v7a`,你可以根据你的需求选择其他 ABI。`NDK_TOOLCHAIN_VERSION` 变量用来指定你要使用的交叉编译工具链版本,这里我们选择了 `clang`,你也可以选择其他版本。 接下来,你需要编写一个 Makefile 文件来告诉交叉编译器如何编译你的 SO 。下面是一个简单的例子: ``` CROSS_COMPILE = $(NDK_TOOLCHAIN_PREFIX) CC = $(CROSS_COMPILE)gcc CFLAGS = -fPIC -Wall LDFLAGS = -shared LIB_SRC = my_lib.c LIB_OBJ = $(LIB_SRC:.c=.o) LIB_SO = libmy_lib.so all: $(LIB_SO) $(LIB_SO): $(LIB_OBJ) $(CC) $(LDFLAGS) -o $@ $< $(LIB_OBJ): $(LIB_SRC) $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(LIB_SO) $(LIB_OBJ) ``` 在这个例子中,我们首先定义了交叉编译器前缀和编译器。在 `all` 目标中,我们告诉 Makefile 编译我们的 SO 文件。在 `$(LIB_SO)` 目标中,我们使用 `$(LDFLAGS)` 来告诉编译生成一个共享文件。在 `$(LIB_OBJ)` 目标中,我们使用 `$(CFLAGS)` 来告诉编译生成目标文件。 最后,你需要在 Linux NDK使用这个 Makefile 文件来交叉编译你的。你可以使用以下命令来交叉编译你的: ``` ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk ``` 在这个命令中,`NDK_PROJECT_PATH` 变量用来指定你的项目路径,`APP_BUILD_SCRIPT` 变量用来指定你的 Makefile 文件路径。 当编译完成后,你会在 `libs` 目录下找到你的 SO 文件。你可以将这个 SO 文件复制到你的应用程序中,并在代码中使用它。 希望这个回答能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值