Android 深入系统完全讲解(36)

Posted 程序员入门进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 深入系统完全讲解(36)相关的知识,希望对你有一定的参考价值。

6.5 进阶
我们再反过头来,看看写个 hello JNI 可执行文件 这个章节,输出的命令,简单来讲,主要
分为几步骤:
[armeabi-v7a] Compile thumb : hello-exe <= hello-exe.c 把 c 编译成 o
[armeabi-v7a] Executable : hello-exe 链接,把依赖的静态库 ,动态库链接进来 ,变成可执
行文件
[armeabi-v7a] install : hello-exe => libs/armeabi-v7a/hello-exe 去掉调试信息,减小大小
我们再来看下 D:\\android-ndk-r19c\\hello-exe 的 obj 目录分析
D:\\android-ndk-r19c\\hello-exe\\obj\\local\\armeabi-v7a hello-exe 这个是有调试信息的。
D:\\android-ndk-r19c\\hello-exe\\obj\\local\\armeabi-v7a\\objs\\hello-exe hello-exe.o 是上面 1 编
译出来的结果 hello-exe.o.d 这个文件可以打开瞧瞧,生成了一个 makefile 的编译规则。( r8
编译出来多一些,可以看看 )
d:/android-ndk-r19c/hello-exe/obj/local/armeabi-v7a/objs/hello-exe/hello-exe.o:
d:/android-ndk-r19c/hello-exe/jni/hello-exe.c ARM GCC 编译参数中主要关注几个内容:
-fxxx 系统的一些编译参数
-Dxxx -Dxxx=2 自定义的编译参数
–sysroot 设定系统搜索路径,设定 base 路径,-I 参数可以以这个路径为当前路径
-I 定义 include 路径,也就是从哪里找头文件
-target 设定目标 ARM 具体类别
-W 设定什么类型对应是否报错之类的
-l 指定链接是需要的库名
-L 指定链接库找到路径
补充一点:我们移植三方库到 Android 平台,默认的开源项目都是 GCC 版本的,一般情况
下,将 GCC 的 配置成 ARM GCC ,基本就能跑通。同时要多看官方的 ReadMe 文件。
./configure --help 能看到一些配置要求,参考这个,同时找一些网上别人移植的过程,基本
能够保证移植通过。
有时间的,可以看看 Makefile 的编写规则,了解 GCC 的编译整个过程。 写个 hello JNI 调用 so
经过上一节的洗礼,是否对于这个整体过程有了了解呢?前几节用手把手的方式,详尽的讲
解了一个使用 NDK 编译出来一个 可执行文件的过程,并且讲解了几个关键文件的配置方
式,编译过程具体是什么,以及关键的编译参数。
缓一下,好好吸收下。然后我们继续往下走,我们这一节通过编写一个 so 库 ,然后再调
用这个 so 中的方法,写一个可执行文件。从这一节开始,就不贴详细的代码了,因为贴上
代码,篇幅就太长了 。具体代码都已经分享,大家下载阅读即可。
7.1 新增一个 so 库的编译规则
LOCAL_MODULE:= hello-soLOCAL_SRC_FILES := hello-so.c
LOCAL_LDLIBS := -fpic -fPIE -pie
include $(BUILD_SHARED_LIBRARY)
7.2 hello-so.c 实现一个 my_print 方法
int my_print()

printf(“Hello JNI !\\n”);

7.3 然后我们在我们的可执行文件中引用这个 so 库
LOCAL_SHARED_LIBRARIES:=hello-so //引用动态库
include $(BUILD_EXECUTABLE)//编出一个可执行文件
7.4 hello-exe.c 改动比较大,我们看下
int main()

void *handle;
char *error;
my_print print_func = NULL;//打开动态链接库
handle = dlopen(LIB_PATH, RTLD_LAZY);
if (!handle)
printf(“%s\\n”, dlerror());
exit(0);

//获取 print 函数
*(void **) (&print_func) = dlsym(handle, “my_print”);
if ((error = dlerror()) != NULL)
printf(“%s\\n”, dlerror());
exit(0);

printf(“%d”,(*print_func)());
//关闭动态链接库
dlclose(handle);

以上是关于Android 深入系统完全讲解(36)的主要内容,如果未能解决你的问题,请参考以下文章

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(33)

Android 深入系统完全讲解(31)

Android 深入系统完全讲解(31)

Android深入系统完全讲解(38)

Android深入系统完全讲解(38)