类型转换
- 1 static_cast 静态转换 用于基本数据类型之间的转换,如把int转换成char
- 2 const_cast 常量转换 用于修改常量的值
- 3 reinterpret_cat 强制类型转换 ,用于转换任意类型
- 4 dynamic_cast 动态转换 ,更安全,转换成功返回类型,失败返回空 ,必须要包含多态类型和 static_cast 很类似,但是更安全
Native层实现System.arrayCopy()方法
Java_com_peakmain_myapplication_MainActivity_arraycopy(JNIEnv *env, jclass type, jobject src,
jint srcPos, jobject dest, jint destPos,
jint length) {
//判断是否是数组
//都是数组,需要类型转换
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_ERROR, "TAG", "转换成功");
for (int i = srcPos; i < srcPos + length; ++i) {
jobject obj = env->GetObjectArrayElement(src_array, i);
//放到新的数组里面
env->SetObjectArrayElement(dest_array,i,obj);
}
}
调用
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Person[] person1 = new Person[10];
for (int i = 0; i < person1.length; i++) {
person1[i] = new Person("Peakmain", 20 + i);
}
Person[] person2 = new Person[10];
arraycopy(person1, 0, person2, 0, person1.length);
for (Person person : person2) {
Log.e("TAG", person.age + "");
}
}
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
c++中异常处理
自定义异常
class Exception{
public:
string msg;
public:
Exception(string msg){
this->msg = msg;
}
public :
const char*what(){
return this->msg.c_str;
}
};
void main(){
// c++ 中有自己一套异常的体系,不要去强记
// 但是 c++ 可以抛任何数据类型 try{}catch(数据类型 变量名){}
// throw 抛异常
try{
int i = -1;
if (i == 0){
throw Exception("出异常了");
}
if (i < 0){
throw 11.8f;
}
}
catch (int number){
cout << "捕捉到异常" << number << endl;
}
catch (Exception exception){
cout << "捕捉到异常:" << exception.what() << endl;
}
catch (...){
cout << "捕捉到其他异常:" << endl;
}
getchar();
}
NDK 异常总结
- 在 c++ 层如果是自己写的代码或者调用别人的方法抛出异常,记得要 try , 如果不 try 在 java 层 try 是没有意义的
- 如果异常需要往外抛给 java 层,一定要按照java层抛异常的方式
- 如果是自己写的 NDK 层的代码,最好抛自己写的异常,声明异常
- 如果是做 c++/c , 或者是帮 c/c++ 写代码,最好抛系统定义好的异常或者继承系统的异常
- 系统异常的体系 参看文章
字符串操作
对象的操作
string str1 = "123";
string str2("123");
string str3(5, 'A');// 实际是5 个 A = AAAAA
string *str4 = new string("123");
string 与 char* 相互之间转换 c_str()
//string->char*
const char* c_str1 = str1.c_str();
//char*->string
char*c_str = "Peakmain";
string str(c_str);
cout << str.c_str() << endl;
网友评论