Android深入系统完全讲解(39)
Posted 程序员入门进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android深入系统完全讲解(39)相关的知识,希望对你有一定的参考价值。
先回过头,看看第七小节,专门讲解了一个可执行文件怎么调用so库的方法的。 Java 就顺着这来理解。所以,第七小节是本质内容,是 JNI 中的实现的底层逻辑,具体研究,可以跟踪System.loadLibrary 方法 ,一探究竟。12. 添加一个新的方法12.1 MainActivity.java 文件加一行public native String myStringFromJNI(); 12.2 自动化生成 .h 文件
这样子就生成了对应的 .h 。如果你想手动处理,可以参考 javac 命令。12.3 实现方法在 jni 目录的 .h 复制对应的声明,这里为:Java_hellojni_codegg_com_hellojni_MainActivity_myStringFromJNI在cpp目录的natie-lib.cpp 中实现:extern “C” JNIEXPORT jstring JNICALL Java_hellojni_codegg_com_hellojni_MainActivity_myStringFromJNI (JNIEnv *env, jobject) std::string hello = “my Hello from C++”; return env->NewStringUTF(hello.c_str());
12.4 修改 MainActivity.java 中调用我们的方法tv.setText(StringFromJNI()); 修改为 tv.setText(myStringFromJNI());编译,运行 APK,可以看到修改已经生效。13. CMake 和 ndk-build 的关系CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。NDK 是一套工具,允许您为 android 使用 C 和 C++ 代码,并提供众多平台库,您可用其管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。CMake 是新的编译规则写法,ndk-build 是老的方案。如果想用 ndk-build 也是可以的,毕竟一些老的项目是,那么该如何解决呢?前面小节将编译过程在哪里,参数如何配置。希望大家能够再回过头,仔细看一遍,理解CMake 和 NDK 的关系。 新的项目都会使用 CMake 方式编写编译规则,详情请关注官网:https://cmake.org/cmake-tutorial/我们把 CMake 变成 NDK 的配置方式,来看看都有哪些操作。14. 使用 ndk-build 方案
14.1 jni 目录编写 Android.mk 、 Application.mk Android.mk 编一个 libnative-lib.so 库。LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= native-lib LOCAL_SRC_FILES := native-lib.cpp
LOCAL_LDLIBS :=-fpic-fPIE-pie include $(BUILD_SHARED_LIBRARY) Application.mk 配置一些公共参数APP_STL := c++_static APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti APP_ABI := armeabi-v7a 14.2 修改hellojni\\app build.gradle externalNativeBuild ndk //这里 ndk 配置moduleName “native-lib” //编译模块,还有哪些参数,右键Ctrl+ 鼠标点击即可看到abiFilters “armeabi-v7a” //编译指令体系 这个文件同时修改:externalNativeBuild ndkBuild //这里 ndk 配置path “src/main/jni/Android.mk” // 指定从哪找Android.mk
14.3 验证结果。编译,运行 APK ,查看结果。不出意外,正常运行起来了。区别就是我们使用的是 NDK 的编译方式。
编译过程,可以查看 .externalNativeBuild\\ndkBuild 目录,进行学习。很多时候,多看看 Build目录,很多过程信息都在这里存档的,是学习过程中,不断验证,不断观察的好的内容。
14.1 jni 目录编写 Android.mk 、 Application.mk Android.mk 编一个 libnative-lib.so 库。LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= native-lib LOCAL_SRC_FILES := native-lib.cpp
LOCAL_LDLIBS :=-fpic-fPIE-pie include $(BUILD_SHARED_LIBRARY) Application.mk 配置一些公共参数APP_STL := c++_static APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti APP_ABI := armeabi-v7a 14.2 修改hellojni\\app build.gradle externalNativeBuild ndk //这里 ndk 配置moduleName “native-lib” //编译模块,还有哪些参数,右键Ctrl+ 鼠标点击即可看到abiFilters “armeabi-v7a” //编译指令体系 这个文件同时修改:externalNativeBuild ndkBuild //这里 ndk 配置path “src/main/jni/Android.mk” // 指定从哪找Android.mk
14.3 验证结果。编译,运行 APK ,查看结果。不出意外,正常运行起来了。区别就是我们使用的是 NDK 的编译方式。
编译过程,可以查看 .externalNativeBuild\\ndkBuild 目录,进行学习。很多时候,多看看 Build目录,很多过程信息都在这里存档的,是学习过程中,不断验证,不断观察的好的内容。
以上是关于Android深入系统完全讲解(39)的主要内容,如果未能解决你的问题,请参考以下文章