c/c++

c++基础-异常处理和字符串操作

2019-02-25  本文已影响13人  Peakmain

类型转换

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 异常总结

  1. 在 c++ 层如果是自己写的代码或者调用别人的方法抛出异常,记得要 try , 如果不 try 在 java 层 try 是没有意义的
  2. 如果异常需要往外抛给 java 层,一定要按照java层抛异常的方式
  3. 如果是自己写的 NDK 层的代码,最好抛自己写的异常,声明异常
  4. 如果是做 c++/c , 或者是帮 c/c++ 写代码,最好抛系统定义好的异常或者继承系统的异常
  5. 系统异常的体系 参看文章

字符串操作

对象的操作

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;
上一篇下一篇

猜你喜欢

热点阅读