1.使用AndroidStudio创建项目,勾选支持C++,完成之后如果提示如下图所示错误,是因为没有安装编译工具Cmake,解决办法如图所示,在设置中勾选Cmake,下载安装即可。

NDK&jni基础笔记

NDK&jni基础笔记

2.构建配置文件CMakeLists.txt,用于配置添加模块

NDK&jni基础笔记

3.配置abi,在build.gradle中用于配置需要生成的二进制文件

NDK&jni基础笔记

4.在java源文件中设置导入静态库

NDK&jni基础笔记

5.声明本地方法

NDK&jni基础笔记

6.调用本地方法

NDK&jni基础笔记

7.在native-lib.cpp中编写实现本地方法,其中格式必须按照java_包名_类名_方法名的形式填写

NDK&jni基础笔记

8.运行结果如图:

NDK&jni基础笔记

9.另一种NDK开发方式,原生Activity方式,这种方式,可以不适用java代码直接使用C++开发。Android SDK 中提供了帮助类 NativeActivity(可以在,sdk文档中查找相关信息)可用于写入完全原生的 Activity。NativeActivity可处理 Android 框架与原生代码之间的通信,因此您不必为其创建子类或调用其方法, 只需在清单文件中声明要设为原生的应用,然后开始创建原生应用,通过使用这个类中的回调方法实现相对应的Activity生命周期。

NDK&jni基础笔记


10.java和C进行通信使用了JNI的方式。

其中数据类型对应关系规律如下:

Jni类型是直接在对应的java类型前加‘j’,对应的C++类型,boolean-unsigned char,byte-char,char-unsigned short,long-long long(64位),其他类型一致;

引用类型有jclass,jstring,j<type>array,jthrowable

描述符,boolean-Z,long-J,其他为数据类型的大写首字母,应用类型为“Ljava/lang/String;”,数组为:“[”,方法为:“(参数)返回值”,例:“([B)V”。

 

11.创建字符串使用函数NewStringUTF():C转java,GetStringUTFChars():java转C

 

12.数组的相关函数为New<类型>Array(),类型为基本类型,创建对应基本类型的数组

 

13.创建对象数组函数NewObjectArray(),赋值SetObjectArrayElement()

 

14.获取/设置非静态属性的函数为Get<type>Field()/Set<type>Field()

 

15.获取/设置静态属性的函数为GetStatic<type>Field()/SetStatic<type>Field()

 

16.JNI中(非)静态方法为:返回值类型 Call<type>Method();步骤为:GetMethodID获取方法域ID,调用对应方法;区别在于静态方法获取域ID使用GetStaticMethodID

 

17.动态注册Native

步骤:1)java代码中声明native方法,2)C++层实现,3)natice层通过static数组将本地方法和java层方法绑定,4)使用JNI_OnLoad函数注册(其中注册步骤为:GetEnv()获取JNIEnv指针,FindClass()获取Class,RegisterNatives()注册,返回版本),5)java层调用本地方法。


18.LLDB动态调试Native

       在项目设置中选择native方式,在Native代码中添加断点,调试运行,代码将断下来,如图所示:

NDK&jni基础笔记

  选择LLDB命令窗口

NDK&jni基础笔记

  查看变量值

NDK&jni基础笔记

  查看命令帮助

NDK&jni基础笔记

  断点列表,支持命令自动匹配,可以不输入完整命令。

NDK&jni基础笔记

  指定行设置断点

NDK&jni基础笔记



相关文章:

  • 2021-10-01
  • 2021-08-13
  • 2021-12-06
  • 2021-08-14
  • 2021-12-08
  • 2022-12-23
  • 2022-12-23
  • 2022-03-04
猜你喜欢
  • 2022-01-08
  • 2021-05-25
  • 2021-06-01
  • 2021-04-28
  • 2021-07-23
  • 2021-06-16
  • 2022-02-17
相关资源
相似解决方案