Android JNI抛出异常处理
来源:互联网 发布:mysql 最近一条记录 编辑:程序博客网 时间:2024/04/26 04:11
为了从JNI中抛出一个java异常,首先,使用FindClass()找到对应的类(像使用java的反射API);这里通过JNI提供的机制,很好的介绍了java的回调。在JNI中使用指定的jcalss来表示引用的java类。这里使用jclass类型来描述一个异常实例,并在当前类加载器中通过完整名称(包含包路径)来搜索类描述符。此外,我们不长时间需要引用异常类时,可以使用DeleteLocalRef()来解除引用。
注意:不要忘记处理返回值;
FindClass()和JNI方法可能会失败的原因如下:没有足够的可用内存、类没有找到等等
一旦异常抛出,就不会调用JNI异常清理方法(DeleteLocalRef()、DeleteGlobalRef()等等)。本地代码将清理它的资源并将控制交给后面的java,如果没有java被调用,它可能执行本地处理(native process)。当被地方法返回时,异常被VM传递给JAVA。
如果其他地方不需要再使用时,需要删除本地引用(指向类描述符)。当JNI借给你东西时,不要忘记还回去。
1、实现一个java异常类(InvalidTypeException.java)
public class InvalidTypeException extends Exception {
public InvalidTypeException(String pDetailMessage){
super(pDetailMessage);
}
}
2、在java的JNI接口类中指定抛出异常()
public class Store {
static {
System.loadLibrary("store");
}
public native int getInteger(String pKey)
throws NotExistingKeyException, InvalidTypeException; //指定抛出两个异常
}
3、在java中处理抛出的异常信息
try{
if(sItem == "Integer") {
mUIValueEdit.setText( Integer.toString(mStore.getInteger(lKey)) );
}
else if (sItem == "String"){
mUIValueEdit.setText( mStore.getString(lKey) );
}
}
catch(NotExistingKeyException eNotExistingKeyException){
displayError("Key does not exist in Store");
}
catch(InvalidTypeException eInvalidTypeException){
displayError("错误的数据类型");
}
Java中的异常处理已经完成,现在我们可以在JNI中来抛出上面定义的异常。
4、JNI中实现一个异常抛出方法
void throwInvalidTypeException(JNIEnv* pEnv)
{
jclass lClass = (*pEnv)->FindClass(pEnv,“com/packtpub/exception/InvalidTypeException”);
if (lClass != NULL) {
(*pEnv)->ThrowNew(pEnv, lClass, “Invalid Type.”);
}
//如果我们长时间不再需要引用这个异常类时,可以使用DeleteLocalRef()来解除它。
(*pEnv)->DeleteLocalRef(pEnv, lClass);
}
5、JNI中调用4中的方法,抛出异常
int32_t isEntryValid(JNIEnv* pEnv, StoreEntry* pEntry, StoreType pType)
{
if (pEntry->mType != pType) {
throwInvalidTypeException(pEnv); //抛出异常
}
else {
return 1;
}
return 0;
}
- Android JNI抛出异常处理
- JNI中抛出异常
- JNI中抛出异常
- 10.7抛出异常处理
- 抛出处理异常
- jni异常,c++抛出异常,java捕获
- 异常 -- 捕获处理 &抛出处理
- Java异常处理-----抛出处理
- Java异常处理-----抛出处理
- Android - HttpURLConnection 抛出异常
- Android NDK之JNI异常处理
- Android NDK(七):JNI异常处理
- 异常处理----声明抛出异常-人工抛出异常
- 异常处理----声明抛出异常/人工抛出异常
- JNI调用Native方法,抛出UnsatisfiedLinkError异常
- 抛出异常,继续处理程序
- hive抛出NullPointerException异常处理
- finally 中抛出异常处理
- 成为IT精英,我奋斗了7年
- NYOJ 31 5个数求最值
- android 数据库用sql语句的 crud
- tomcat学习笔记(二) 模拟一个简单的servlet容器
- 我来了 csdn
- Android JNI抛出异常处理
- java编码问题(中文乱码的原因)
- C陷阱篇之运算符优先级
- Business Analyst
- with rollup技巧
- tweepy(Twitter API) status object
- 一个基于 exosip 库的 UAC 和 UAS 的代码整理
- Daily article(7)
- 《黑马程序员》io---流初识