JNI调用java方法, new java对象,new java内部类,jnijava
分享于 点击 6342 次 点评:245
JNI调用java方法, new java对象,new java内部类,jnijava
欢迎转载学习 ,转载请注明:http://blog.csdn.net/qq377366355/article/details/77869801
JNI调用java方法, new java对象,new java内部类
1.new java对象 new java内部类
创建内部类,要先创建外部类实例构造方法都是用<init>
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; } //构造方法都是使用<init> jmethodID javaNewTest = env->GetMethodID(clazzTest, "<init>", "()V"); if(javaNewTest == 0){ LOGI("form c find javaNewTest error"); return -1; } //Lcom/jninewjavaclass/Test; 构造方法为空这个也要用上,不知道为什么 jmethodID javaNewT = env->GetMethodID(clazzT, "<init>", "(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这个类,但这个类的构造方法是私有的,所以出错了,如果调用其它的类出这个错,多数是方法名或参数有误。
相关文章
- 暂无相关文章
用户点评