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 {  |