JNI中抛出异常

应用场景:

利用Java的JNI机制调用C写好的类库,现在需要在C的类库中抛出异常,然后在应用层即java上面捕获异常。

 

具体的实现形式如下

首先定义一个异常类


class NumberNotFounded extends Exception {
    NumberNotFounded(){
        super();
    }   
    NumberNotFounded(String reason){
        super(reason);   
    }
}

 

接着定义一个带有native方法的JNI类。

class ExceptionAccess{

    public native int doit();

    static {
        System.load("/home/dianping/Peter/Exception/libExceptionAccess.so");   
    }   
}

 

我们会在doit()中抛出异常。先用javah生成头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ExceptionAccess */

#ifndef _Included_ExceptionAccess
#define _Included_ExceptionAccess
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     ExceptionAccess
 * Method:    doit
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_ExceptionAccess_doit
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


接着编写.c文件

 

#include "ExceptionAccess.h"

JNIEXPORT jint JNICALL Java_ExceptionAccess_doit
  (JNIEnv * env, jobject obj)
{
    jclass cls;
    cls = ( *env)->FindClass(env,"NumberNotFounded");
    if(cls == NULL){
        return;
    }   
    (*env)->ThrowNew(env,cls,"code from C");
}

编译之,记得编译的时候用 -I带上头文件的路径,不知道可以baidu之。

 

然后编写一个测试的类

 

import java.io.*;

class caller {
    public static void main(String args[]) {
        ExceptionAccess EA = new ExceptionAccess();
        try
        {
            EA.doit();

        }catch (Exception e){
            System.out.println("java c"+e);
        }
    }
}

 

到此完成

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值