1. 类型转换
1 | Student *stu = static_cast<Student*>(person); // 正确 |
1.1 static_cast 静态转换
非指针情况下:子类可以转换成父类,父类不能转换成子类,指针情况下可以
用于基本数据类型之间的转换,如把int转换成char
1 | class Person{ |
1.2. const_cast 常量转换
用于修改常量的值(转换成了不是常量的指针然后去修改值
)
1 | int main(){ |
1.3. reinterpret_cast 强制类型转换
用于转换任意类型
非指针情况下:子类可以转换成父类,父类不能转换成子类,指针情况下可以
jni
中常见的是long
转指针
1 | int main(){ |
1.4. dynamic_cast 动态转换
必须要包含多态类型
,虽然更安全
,转换成功返回类型,失败返回空
,
和 static_cast
很类似,但是更安全
static_cast 一般用于转换有继承关系的类型
1 | int main(){ |
2. native 层实现 System.arrayCopy 的功能
具体代码请看:NDKPractice项目的cpp21
jobject obj = env->GetObjectArrayElement(src_array,srcPos+i);
:获取jobjectArray中下标为srcPos+i的数据。env->SetObjectArrayElement(dest_array,destPos+i,obj);
:设置jobjectArray中下标为destPos+i的数据为obj
1 | extern "C" |
3. 异常处理
- c++ 中有自己一套异常的体系,不要去强记 c++自己的异常
- 但是 c++ 可以抛任何数据类型
try{}catch(数据类型 变量名){}
- throw 抛异常
1 | int main(){ |
NDK 异常总结:
- 在 c++ 层如果是自己写的代码或者调用别人的方法,记得要 try 住, 如果不 try 在 java 层 try 是没有意义的
- 如果异常需要往外抛给 java 层,一定要按照java层抛异常的方式
- 如果是自己写的 NDK 层的代码,最好抛自己写的异常,声明异常
- 如果是做 c++/c , 或者是帮 c/c++ 写代码,最好抛系统定义好的异常或者继承系统的异常
- 系统异常的体系 exception 基类 https://www.cnblogs.com/QG-whz/p/5136883.html
1 | void c_method() throw(Exception,int){ // 如果是自己写的, 1000 多行 |
4.NDK异常处理增强
1 | class Exception : public out_of_range { |