SlideShare a Scribd company logo
1 of 20
そんなに難しくない
C/C++からJVMの起動
JJUGナイトセミナー2012-08-29
    ライトニングトーク
       高橋 徹
発表者について
            @boochnich
     http://d.hatena.ne.jp/torutk/
• 仕事では、C/C++/Javaまんべんなく
  – 非Web系分散処理(CORBA、マルチキャス
    ト・・・)
  – GUI(Swing, X/Motif,GTK+・・・)
  – GIS(地図)

• Java読書会BOF現代表
  – 1998年~毎月1回開催、通算161回、24冊
  http://www.javareading.com/bof/
JVMを起動するC++コード(骨子)
#include <jni.h>

int main()                                             説明用につき、
{
    JavaVMOption options[2];                           エラー処理、動
    options[0].optionString = "-Xmx64m";
    options[1].optionString = "-Djava.class.path=.";   作確認ログなど
    JavaVMInitArgs vm_args;                            は省略していま
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
                                                       す。
    vm_args.nOptions = 2;

    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(clazz, mid, NULL);

    jvm->DestroyJavaVM();
}
JVMを起動するC++コード(骨子)
#include <jni.h>
int main()
{
    JavaVMOption options[2];
    options[0].optionString = "-Xmx64m";
    options[1].optionString = "-Djava.class.path=.";

    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 2;

     JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(clazz, mid, NULL);

    jvm->DestroyJavaVM();
}
JVMを起動するC++コード(骨子)
#include <jni.h>

int main()
{

 JavaVMOption options[2];
 options[0].optionString = "-Xmx64m";
 options[1].optionString = "-Djava.class.path=.";
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 2;

    JNIEnv* env;
                   JavaVMに指定するオプションを列挙
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
                   起動したJavaVMが使用するクラスパス
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
                   は、システムプロパティ java.class.pathで
    env->CallStaticVoidMethod(clazz, mid, NULL);


                   定義
JVMを起動するC++コード(骨子)
#include <jni.h>

        JavaVMを起動するAPIに渡す設定
int main()
{
    JavaVMOption options[2];

     JNIのバージョン、JavaVMオプションを指定す
    options[0].optionString = "-Xmx64m";
    options[1].optionString = "-Djava.class.path=.";
     る
   JavaVMInitArgs vm_args;
   vm_args.version = JNI_VERSION_1_6;
   vm_args.options = options;
   vm_args.nOptions = 2;
   JNIEnv* env;
   JavaVM* jvm;
   int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
   jclass clazz = env->FindClass("Hello");
   jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
   env->CallStaticVoidMethod(clazz, mid, NULL);
JVMを起動するC++コード(骨子)
#include <jni.h>

int main()
{
    JavaVMOption options[2];
    options[0].optionString = "-Xmx64m";
    options[1].optionString = "-Djava.class.path=.";



   JavaVMInitArgs vm_args;
   vm_args.version = JNI_VERSION_1_6;
   vm_args.options = options;
   vm_args.nOptions = 2;
        <jni.h>に定義されている定数(JDK 7u6)
        #define JNI_VERSION_1_1 0x00010001
   JNIEnv* env;

        #define JNI_VERSION_1_2 0x00010002
   JavaVM* jvm;
   int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
        #define JNI_VERSION_1_4 0x00010004
   jclass clazz = env->FindClass("Hello");
   jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
   env->CallStaticVoidMethod(clazz, mid, NULL);0x00010006
        #define JNI_VERSION_1_6
JVMを起動するC++コード(骨子)
#include <jni.h>

int main()
{

    JavaVMOption options[2];
    options[0].optionString = "-Xmx64m";
    options[1].optionString = "-Djava.class.path=.";



    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 2;
    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
JVMを起動するC++コード(骨子)
#include <jni.h>

int main()
{

    JavaVMOption options[2];
    options[0].optionString = "-Xmx64m";
    options[1].optionString = "-Djava.class.path=.";



    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 2;
    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
JVMを起動するC++コード(骨子)
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 2;



JNIEnv* env;
JavaVM* jvm;
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(clazz, mid, NULL);


               JavaVMを起動します
    jvm->DestroyJavaVM();
}
JVMを起動するC++コード(骨子)
#include <jni.h>

int main()
{
    JavaVMOption options[2];
    options[0].optionString = "-Xmx64m";
    options[1].optionString = "-Djava.class.path=.";
                    起動したJavaVMにクラスをロードします。
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_6;

                    クラスはFQCNで記述
    vm_args.options = options;
    vm_args.nOptions = 2;

    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(clazz, mid, NULL);

    jvm->DestroyJavaVM();
}
JVMを起動するC++コード(骨子)
    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");

    jmethodID mid = env->GetStaticMethodID(
         clazz, "main", "([Ljava/lang/String;)V“
      );
    env->CallStaticVoidMethod(clazz, mid, NULL);

    jvm->DestroyJavaVM();
}

        クラスのメソッドIDを取得します。

        メソッド名
        メソッドシグニチャ(引数の型・戻り値型)
JVMを起動するC++コード(骨子)
    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

      シグニチャの調べ方
    jclass clazz = env->FindClass("Hello");

    jmethodID mid = env->GetStaticMethodID(
          clazz, "main", "([Ljava/lang/String;)V“
      C:work> javap -s Hello
      );
      Compiled from "Hello.java"
    env->CallStaticVoidMethod(clazz, mid, NULL);
        public class Hello {
            public Hello();
    jvm->DestroyJavaVM();
}
               Signature: ()V

            public static void main(java.lang.String[]);
              Signature: ([Ljava/lang/String;)V
        }
JVMを起動するC++コード(骨子)
    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");

    env->CallStaticVoidMethod(clazz, mid, NULL);
    jvm->DestroyJavaVM();
}



             メソッドを実行します
JVMを起動するC++コード(骨子)
    JNIEnv* env;
    JavaVM* jvm;
    int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    jclass clazz = env->FindClass("Hello");
    jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(clazz, mid, NULL);



    jvm->DestroyJavaVM();
}




               JavaVMを破棄します
コンパイル・リンク
• Windows (Visual C++)の場合

cl /I"C:Program Files (x86)javajdk1.7.0include“
   /I"C:Program Files (x86)javajdk1.7.0includewin32"
   /EHsc
   launch.cpp
   /link
   /LIBPATH:"C:Program Files (x86)Javajdk1.7.0lib“
   jvm.lib
実行
• Windows (Visual C++)の場合

C:work> PATH=%PATH%;”C:Program Files (x86)java
jdk1.7.0jrebinclient”

C:work> launch
Hello, World!

C:work>
補足
• jvm.dllを明示的リンクせず暗黙的リンクす
  ると柔軟性が増す
 – LoadLibraryでjvm.dllを読み込む
 – 複数バージョンのJavaVMを使い分ける等


• 非ASCII(日本語)文字列を渡す場合注意
 – C/C++側で文字コードを扱うのは悲惨
 – C++ 11で光明あり(u8”こんにちは”)
情報源
• 公式ドキュメント(日本語訳版)
 – http://docs.oracle.com/javase/jp/6/technotes/gui
   des/jni/index.html
• 書籍(古いが日本語の唯一のも)
 – 「JNI Java Native Interfaceプログラミング」
 (ピアソン・エデュケーション刊、1998年)
• 拙著Web記事
 – http://www.02.246.ne.jp/~torutk/javahow2/jni.h
   tml
ご清聴を感謝します


このスライドが出るということ
 は、しゃべりが早すぎだ!

More Related Content

What's hot

[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack TangCODE BLUE
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかHisashi Aruji
 
KLab勉強会#6 発表資料
KLab勉強会#6 発表資料KLab勉強会#6 発表資料
KLab勉強会#6 発表資料Suguru Oho
 
とあるイルカのバーボンハウス
とあるイルカのバーボンハウスとあるイルカのバーボンハウス
とあるイルカのバーボンハウスyoku0825
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法LINE Corporation
 
HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)Yasumasa Suenaga
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~JustSystems Corporation
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目hecomi
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?kwatch
 

What's hot (11)

Slide
SlideSlide
Slide
 
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
KLab勉強会#6 発表資料
KLab勉強会#6 発表資料KLab勉強会#6 発表資料
KLab勉強会#6 発表資料
 
とあるイルカのバーボンハウス
とあるイルカのバーボンハウスとあるイルカのバーボンハウス
とあるイルカのバーボンハウス
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
 
CPUから見たG1GC
CPUから見たG1GCCPUから見たG1GC
CPUから見たG1GC
 
HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 

Similar to Jjug night seminar201208_lt_cxxからjvm起動

Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うTatsumi Naganuma
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsUehara Junji
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3Tomoyuki Sato
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXShinya Mochida
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)tnoda
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Uehara Junji
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部haruki ueno
 
env EDITOR=vipw vipwしてみた
env EDITOR=vipw vipwしてみたenv EDITOR=vipw vipwしてみた
env EDITOR=vipw vipwしてみたogatay
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 

Similar to Jjug night seminar201208_lt_cxxからjvm起動 (16)

Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/Grails
 
ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3ありえるえりあ勉強会@五反田~テスト編~ Part3
ありえるえりあ勉強会@五反田~テスト編~ Part3
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
Cve 2013-0422
Cve 2013-0422Cve 2013-0422
Cve 2013-0422
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
env EDITOR=vipw vipwしてみた
env EDITOR=vipw vipwしてみたenv EDITOR=vipw vipwしてみた
env EDITOR=vipw vipwしてみた
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 

More from torutk

LL2021 Java update
LL2021 Java updateLL2021 Java update
LL2021 Java updatetorutk
 
Jjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafxJjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafxtorutk
 
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...torutk
 
LLoT2016 Java Update
LLoT2016 Java UpdateLLoT2016 Java Update
LLoT2016 Java Updatetorutk
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々torutk
 
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)torutk
 
Java one 2013 sf 報告会lt
Java one 2013 sf 報告会ltJava one 2013 sf 報告会lt
Java one 2013 sf 報告会lttorutk
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)torutk
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリークtorutk
 
2011年javaの旅
2011年javaの旅2011年javaの旅
2011年javaの旅torutk
 

More from torutk (10)

LL2021 Java update
LL2021 Java updateLL2021 Java update
LL2021 Java update
 
Jjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafxJjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafx
 
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
 
LLoT2016 Java Update
LLoT2016 Java UpdateLLoT2016 Java Update
LLoT2016 Java Update
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
 
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
 
Java one 2013 sf 報告会lt
Java one 2013 sf 報告会ltJava one 2013 sf 報告会lt
Java one 2013 sf 報告会lt
 
実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)実行可能JavaFXアプリケーションJAR(発表直前版)
実行可能JavaFXアプリケーションJAR(発表直前版)
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリーク
 
2011年javaの旅
2011年javaの旅2011年javaの旅
2011年javaの旅
 

Jjug night seminar201208_lt_cxxからjvm起動

  • 2. 発表者について @boochnich http://d.hatena.ne.jp/torutk/ • 仕事では、C/C++/Javaまんべんなく – 非Web系分散処理(CORBA、マルチキャス ト・・・) – GUI(Swing, X/Motif,GTK+・・・) – GIS(地図) • Java読書会BOF現代表 – 1998年~毎月1回開催、通算161回、24冊 http://www.javareading.com/bof/
  • 3. JVMを起動するC++コード(骨子) #include <jni.h> int main() 説明用につき、 { JavaVMOption options[2]; エラー処理、動 options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; 作確認ログなど JavaVMInitArgs vm_args; は省略していま vm_args.version = JNI_VERSION_1_6; vm_args.options = options; す。 vm_args.nOptions = 2; JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL); jvm->DestroyJavaVM(); }
  • 4. JVMを起動するC++コード(骨子) #include <jni.h> int main() { JavaVMOption options[2]; options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 2; JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL); jvm->DestroyJavaVM(); }
  • 5. JVMを起動するC++コード(骨子) #include <jni.h> int main() { JavaVMOption options[2]; options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 2; JNIEnv* env; JavaVMに指定するオプションを列挙 JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 起動したJavaVMが使用するクラスパス jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); は、システムプロパティ java.class.pathで env->CallStaticVoidMethod(clazz, mid, NULL); 定義
  • 6. JVMを起動するC++コード(骨子) #include <jni.h> JavaVMを起動するAPIに渡す設定 int main() { JavaVMOption options[2]; JNIのバージョン、JavaVMオプションを指定す options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; る JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 2; JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL);
  • 7. JVMを起動するC++コード(骨子) #include <jni.h> int main() { JavaVMOption options[2]; options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 2; <jni.h>に定義されている定数(JDK 7u6) #define JNI_VERSION_1_1 0x00010001 JNIEnv* env; #define JNI_VERSION_1_2 0x00010002 JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); #define JNI_VERSION_1_4 0x00010004 jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL);0x00010006 #define JNI_VERSION_1_6
  • 8. JVMを起動するC++コード(骨子) #include <jni.h> int main() { JavaVMOption options[2]; options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 2; JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
  • 9. JVMを起動するC++コード(骨子) #include <jni.h> int main() { JavaVMOption options[2]; options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 2; JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
  • 10. JVMを起動するC++コード(骨子) JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; vm_args.options = options; vm_args.nOptions = 2; JNIEnv* env; JavaVM* jvm; JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL); JavaVMを起動します jvm->DestroyJavaVM(); }
  • 11. JVMを起動するC++コード(骨子) #include <jni.h> int main() { JavaVMOption options[2]; options[0].optionString = "-Xmx64m"; options[1].optionString = "-Djava.class.path=."; 起動したJavaVMにクラスをロードします。 JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_6; クラスはFQCNで記述 vm_args.options = options; vm_args.nOptions = 2; JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL); jvm->DestroyJavaVM(); }
  • 12. JVMを起動するC++コード(骨子) JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID( clazz, "main", "([Ljava/lang/String;)V“ ); env->CallStaticVoidMethod(clazz, mid, NULL); jvm->DestroyJavaVM(); } クラスのメソッドIDを取得します。 メソッド名 メソッドシグニチャ(引数の型・戻り値型)
  • 13. JVMを起動するC++コード(骨子) JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); シグニチャの調べ方 jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID( clazz, "main", "([Ljava/lang/String;)V“ C:work> javap -s Hello ); Compiled from "Hello.java" env->CallStaticVoidMethod(clazz, mid, NULL); public class Hello { public Hello(); jvm->DestroyJavaVM(); } Signature: ()V public static void main(java.lang.String[]); Signature: ([Ljava/lang/String;)V }
  • 14. JVMを起動するC++コード(骨子) JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL); jvm->DestroyJavaVM(); } メソッドを実行します
  • 15. JVMを起動するC++コード(骨子) JNIEnv* env; JavaVM* jvm; int res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); jclass clazz = env->FindClass("Hello"); jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); env->CallStaticVoidMethod(clazz, mid, NULL); jvm->DestroyJavaVM(); } JavaVMを破棄します
  • 16. コンパイル・リンク • Windows (Visual C++)の場合 cl /I"C:Program Files (x86)javajdk1.7.0include“ /I"C:Program Files (x86)javajdk1.7.0includewin32" /EHsc launch.cpp /link /LIBPATH:"C:Program Files (x86)Javajdk1.7.0lib“ jvm.lib
  • 17. 実行 • Windows (Visual C++)の場合 C:work> PATH=%PATH%;”C:Program Files (x86)java jdk1.7.0jrebinclient” C:work> launch Hello, World! C:work>
  • 18. 補足 • jvm.dllを明示的リンクせず暗黙的リンクす ると柔軟性が増す – LoadLibraryでjvm.dllを読み込む – 複数バージョンのJavaVMを使い分ける等 • 非ASCII(日本語)文字列を渡す場合注意 – C/C++側で文字コードを扱うのは悲惨 – C++ 11で光明あり(u8”こんにちは”)
  • 19. 情報源 • 公式ドキュメント(日本語訳版) – http://docs.oracle.com/javase/jp/6/technotes/gui des/jni/index.html • 書籍(古いが日本語の唯一のも) – 「JNI Java Native Interfaceプログラミング」 (ピアソン・エデュケーション刊、1998年) • 拙著Web記事 – http://www.02.246.ne.jp/~torutk/javahow2/jni.h tml