JNI调用java方法, new java对象,new java内部类

欢迎转载学习 ,转载请注明:http://blog.csdn.net/qq377366355/article/details/77869801

JNI调用java方法, new java对象,new java内部类

1.new java对象 new java内部类

创建内部类,要先创建外部类实例

构造方法都是用

public class Test {
    public void test(){
        Log.e("Test", "form java Class Test test()");
    }
    public void test(int i){
        Log.e("Test", "form java Class Test test() i = " + i);
    }
    public class T{
        public int t(){
            Log.e("T", "form java Class T t()");
            return 666;
        }
    }
}
/*
//创建内部类,要先创建外部类实例
    //先找到外部类
    jclass clazzTest = env->FindClass("com/jninewjavaclass/Test");
    if(clazzTest == 0){
        LOGI("form c      find clazzTest class error");
        return -1;
        }
        //找到内部类,肉部类之前要用 $
        jclass clazzT = env->FindClass("com/jninewjavaclass/Test$T");
        if(clazzT == 0){
        return -1;
        }
        //构造方法都是使用
        jmethodID javaNewTest = env->GetMethodID(clazzTest, "", "()V");
        if(javaNewTest == 0){
        LOGI("form c      find javaNewTest error");
        return -1;
        }
        //Lcom/jninewjavaclass/Test; 构造方法为空这个也要用上,不知道为什么
        jmethodID javaNewT = env->GetMethodID(clazzT, "", "(Lcom/jninewjavaclass/Test;)V");
        if(javaNewT == 0){
        LOGI("form c      find javaNewT error");
        return -1;
        }

        //先new外部类
        jobject  classTest= env-> NewObject(clazzTest, javaNewTest);
        //new内部类
        jobject  classT= env-> NewObject(clazzT, javaNewT, classTest);


        //找到方法
        jmethodID javaTest= env->GetMethodID(clazzTest, "test", "()V");
        //调用Test类的test方法
        env->CallVoidMethod(classTest, javaTest);

        //找到方法 有参方法
        jmethodID javaTest_1= env->GetMethodID(clazzTest, "test", "(I)V");
        //调用Test类的test有参方法
        env->CallVoidMethod(classTest, javaTest_1, 666);

        //内部类方法
        jmethodID javaT= env->GetMethodID(clazzT, "t", "()I");
        //调用Test类的t方法
        int return_Val = env->CallIntMethod(classT, javaT);

        */


 

2. 报错:

 1.JNI ERROR (app bug): local reference table overflow (max= 512)

这个问题坑死人了

jobject  classTest= env-> NewObject(clazzTest, javaNewTest);

如果一直ewObject 要用 env->DeleteLocalRef(classTest); 清除不然会出上面的错误。

另外 在调用Call....Method这类方法时,如果没有返回值要用CallVoidMethod,不然也出上面的错误,开始不知道,我一直调用返回值的方法,导致出上面的错误。

2..java.lang.NoSuchMethodError: no non-static method "............"


我这里由于要用MediaCodec这个类,但这个类的构造方法是私有的,所以出错了,如果调用其它的类出这个错,多数是方法名或参数有误。



你可能感兴趣的:(JNI调用java方法, new java对象,new java内部类)