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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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);
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android