[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);
}
------------------------------------------------------

-- 
高橋智宏