NDK-026: C++07: 异常处理、字符串处理
2025-01-13 本文已影响0人
xqiiitan
26.异常处理、字符串处理
1.c++ 类型转换
1.1 static_cast<T> 静态转化,用于基本类型之间的转化。如int转char。
double num1 = 20.02;
// int num2 = num1; // 直接转化,丢失精度
// 1.用于基本类型之间的转化
int num2 = static_cast<int>(num1);
// 2.把类型转化为另一类型,用于类层次结构中基类和派生类之间指针或引用的转换。
// jobject -> objectArray
Student *stu = Student("Darren", 24);
//Person *person = stu; // person->name.c_str()
Student *stu = static_cast<Student *>(person); // person-> student
1.2 const_cast 常量转化,用于修改常量的值。
const Person *person = new Person("TT", 24);
Person *person1 = const_cast<Person *>(person);
person1->age = 22;
person1->name = "Jack";
// 再通过person访问内容,内容已经被修改了。
1.3 reinterpert_cast 强制类型转化,用于转化任意类型。
可以父类转子类,
Student *stu = reinterpert_cast<Student >(person);
除了子父类各种类型的转换,long -> 对象的指针,
与static_cast 区别,static_cast一般用于转换子父类有继承关系的类型。
reinterpert_cast 也能转换继承关系的类型。
long mPtr = (long)person;
Student *stu = reinterpert_cast<Student *>(mPtr);
1.4 dynamic_cast 动态转换类型
在运行时处理的,运行时就行类型检查。
更安全,转换成功,返回类型;转换失败,返回空。
必须要包含多态类型和 static_cast 很类似,但是更安全。
void main(){
Person *perosn = new Person("Darren",24);
Worker *worker = dynamic_cast<Worker*>(person);
}
2.System.arraycopy(),native层实现
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length);
arraycopy(oldArr,0, newArr,0, oldArr.size());
// JNI实现。
Java_com_darren_ndk_day26_MainActivity_arraycopy(
JNIEnv* env, jclass type, jobject src, jint srcPos,
jobject dest, jint destPos, jint length){
//判断是否数组,有异常,so的问题
//src,dest都是数组,需要类型的转换
jobjectArray src_array = reinterpret_cast<jobjectArray>(src);
jobjectArray dest_array = reinterpret_cast<jobjectArray>(dest);
if(src_array==NULL || dest_array==NULL){ // 转换失败
__android_log_print(ANDROID_LOG_TAG,"TAG","转换失败");
return;
}
for(int i=srcPos; i<srcPos+length; i++){
// 从源数组中取出item,放入目标数组中。
jobject jobj = env->GetObjectArrayElement(src_array, i);
env->SetObjectArrayElement(dest_array,i, obj);
}
// 执行完毕。
}
// java实现
for(int i=0; i<newPersons.length; i++){
newPersons[i]= persons[i];
}
3.异常的处理
C++有自己的异常处理体系。C++可以抛任何数据类型。
也可以抛自定义类Exception的异常。
如果有异常,没有catch住,会立马down机。
一般情况,异常需要抛给java层处理,
jclass je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, "Unknown exception in JNI code.");
然后java层,就可以捕获这个异常。
try{
arraycopy(oldList,0, newList,0, 10);
} catch(Exception e) {
e.printStackTrace();
}
void c_method(){
throw 0;
}
void main(){
try{
int i=0;
if(i==0) {
throw i; // 抛异常-int。
}
}catch(int number){ // catch异常。
cout << "捕捉到num 异常" << endl;
}catch (const Exception &e) { // 传引用,避免反复copy对象。
cout << "捕捉到Exception" << endl;
}catch(...){
cout <<"捕捉到其他类型异常" <<endl;
}
}
总结:
1.在c++层,如果是自己写的代码或调用别人方法,记得要try住,如果不try,在java层try没任何意义。
2.如果异常需要往外抛给java层,一定要按照java层抛异常的方式。
3.如果是自己写的NDK的代码,最好抛自己写的异常。
4.如果是做C++/C,或者帮别人写代码,最好抛系统定义好的异常。或者继承自系统的异常。
5.系统异常的体系,exception 是基类。
4. C++字符串操作 string
STL(容器、迭代、算法)中的内容,Standard Template Library.
4.1字符串对象的构建
string str1 = "123";
string str2("123");
string str3(5, "A"); // 5个A = AAAAA
string *str4 = new string("1234");
cout<< str1.c_str() <<endl;
cout<< str4->c_str() <<endl;
4.2 string与char* 转换。 c_str()
const char* c_str1 = str1.c_str();
char* -> string
char* c_str = "Doom"; // char*处理相对麻烦。
string str(c_str); // 转对象
cout<< str->c_str() <<endl; // 输出要先转为c_str.
反正没事干,何不学点。
ndk开发,java更深入的认识。