[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 12723] Re: 議事録「 Java 言語仕様第 3 版」を読む会(第 5 回)
高橋(智)です。
下記のサンプルを作ってみました。
UTF-8の処理のため、C++Builder(VCL)を利用しています。
"TAKAHASHI,Toru" wrote:
> nativeメソッドから例外をスローすることはできるのか
> ネイティブ側でオブジェクト
> 【宿題】JNIでネイティブ側から例外を生成して投げるサンプルを作成
[TestException.java]
------------------------------------------------------
package test;
public class TestException extends Exception {
private int errorcode;
public TestException(String msg, int errorcode) {
super(msg);
this.errorcode = errorcode;
}
public String getMessage() {
return super.getMessage() + ":" + errorcode;
}
}
------------------------------------------------------
[TestMain.java]
------------------------------------------------------
package test;
public class TestMain {
static {
System.loadLibrary("test");
}
public static void main(String[] args) {
TestMain obj = new TestMain();
try {
obj.foo();
}
catch(TestException ex) {
System.out.println(ex.getMessage());
}
}
public native void foo() throws TestException;
}
------------------------------------------------------
[C++の実装コード]
------------------------------------------------------
#include <vcl.h>
#include <windows.h>
...
#include "test_TestMain.h"
JNIEXPORT void JNICALL Java_test_TestMain_foo(JNIEnv *env, jobject obj) {
_jclass* clz = env->FindClass("Ltest/TestException;");
_jmethodID* cstr = env->GetMethodID(clz, "<init>", "(Ljava/lang/String;I)V");
WideString wmsg = "テスト例外";
UTF8String umsg = UTF8Encode(wmsg);
_jstring* jmsg = env->NewStringUTF(umsg.c_str());
_jthrowable* ex = (_jthrowable*)env->NewObject(clz, cstr, jmsg, (jint)99);
env->Throw(ex);
//env->DeleteLocalRef(ex);
//env->DeleteLocalRef(jmsg);
//env->DeleteLocalRef(clz);
}
------------------------------------------------------
--
高橋智宏