タグ

2014年3月13日のブックマーク (7件)

  • 【Android NDK】JNIEnv*の問題 - ニャッキ格闘列伝

    現在テストしているプログラムを実行していると たまに落ちることがありました。 よく調べていくとJNIEnv*の位置が変わっていました。 現在の手順としては、起動時にJNIをたたき、引数で渡されたJNIEnv*をグローバルに 保存して使いまわすという方向でやっていました。 危険だとはわかっていましたがやはりガベコレの関係か場所が変わってしまうっぽいです。 JNIEnv*がないとCからJavaを呼び出すことができないのでどうにかすれば 取得できるだろうと思いいろいろと探してみました。 通常のJNIでは、JNI_GetCreatedJavaVMs関数を使用しJavaVM*を取得し、 これのメソッドのGetEnv関数を使用するとできるらしい。 Link:JNI JavaVMメモ(Hishidama's Java native interface JVM Memo) 試してみたところ、リンク時にエラ

    【Android NDK】JNIEnv*の問題 - ニャッキ格闘列伝
  • JNI JavaVMメモ(Hishidama's Java native interface JVM Memo)

    他言語からJava実行 JNIを使って、C言語/C++からJavaVMを実行してメソッドを呼び出すことも出来る。 C言語またはC++内でJavaVMを生成(取得)し、後は通常のJNIと同様にコーディングする。 Windowsでの実行環境 リンク時にjvm.libが必要。→(VC++)ライブラリの追加方法 jvm.libは「%JAVA_HOME%\lib」に在る。→(VC++)ライブラリのパス指定方法 実行時にjvm.dllが必要。 jvm.dllは「%JAVA_HOME%\jre\bin\client」や「%JAVA_HOME%\jre\bin\server」に在る。 →(VC++)デバッグ実行時の環境変数PATHの追加方法 JavaVMの生成・破棄 JavaVMのオブジェクトを作成するには、jni.hで宣言されているJNI_CreateJavaVM関数を使う。 これに渡すための引数の初期

  • Java/JNI - PukiWiki

    cygwin-gcc † いろいろ方法はあるんだろうけど、一番簡単そうなdefファイルを作ってやる方法。 関数の数が多いと面倒だが。。 javahでヘッダーを作成したら、そのなかから関数の名前を取り出してきて 以下のようなファイル"hoge.def"を作成する。 EXPORTS Java_NativeFunctions_initialize_1IMPL Java_NativeFunctions_terminate_1IMPL という感じに、EXPORTSのあとに関数命を連ねる(戻り値とか引数は無視) で、ソースファイル"hoge.cpp"として、以下のようにコンパイル g++ -O3 -c hoge.cpp -o hoge.o -O2 -Wall -mrtd -g -mno-cygwin -I<jni.hのある場所> あとはリンク、ここがキモ。 以下のような感じでhoge.defを指定して

  • NativeActivityからのJavaの呼び出し[Android] - 芸軌社公式ブログ

    ここ2日間くらい、AndroidでNativeActivityから自作Javaクラスのメソッドが呼び出せずに悩んでいましたが、無事解決できたのでNativeActivityのCのコードからJavaを呼び出すサンプルを載せます。 Javaクラスの作成 まずは、EclipseでAndroid NDKのサンプルからNativeActivityのプロジェクトを作ります。 Android NDKのサンプルからNativeActivityのプロジェクトを読み込み NativeActivity/srcフォルダにandroid.app.NativeActivityを継承して適当な名前のクラス(ここでは"TestJNI")を作ります。 NativeActivityを継承してクラスを作成 ここに使いたいコードを書いていきます。 // TestJNI.java package com.example.nativ

  • 【Android NDK】C側からJavaのプログラムを呼び出す - ニャッキ格闘列伝

    /** * c側からjavaを呼び出すテスト * JnitestActivity.callJniを呼び出す */ jvoid Java_test_jni_JnitestActivity_callbackJNI( JNIEnv* env, jobject thiz ) { //クラス取得 jclass jcls = (*env)->GetObjectClass( env, thiz ); //メソッド取得 jmethodID mj = (*env)->GetMethodID( env, jcls, "callJni", "()V"); //メソッド呼び出し (*env)->CallObjectMethod( env, thiz, mj ); } 1. クラス情報を取得する まずは対象となるjclassを取得する必要がある。 対象オブジェクトがあるときはGetObjectClass、 名前で指

    【Android NDK】C側からJavaのプログラムを呼び出す - ニャッキ格闘列伝
  • JNIコーディングメモ(Hishidama's Java native interface coding Memo)

    JNIのC言語/C++側のコーディング C言語とC++の違い コーディング例 JNI関数の概要 プリミティブ型・参照型(JavaオブジェクトのC/C++での扱い) String型 [/2006-11-09] 配列型 クラスの取得・インスタンス生成 [/2008-02-02] オブジェクトのメソッド呼び出し [/2008-02-07] オブジェクトのフィールド操作 ローカル参照の終了 [2006-11-09] 例外処理 [/2007-10-13] jni.hの中でC言語/C++で使える構造体 (クラス)が定義されているが、 コンパイラーがC言語の場合とC++の場合では定義のされ方が異なり、使い方も少し異なる。 JniJikken.c: JniJikken.cpp: #include "JniJikken.h" JNIEXPORT jbyteArray JNICALL Java_JniJikk

  • メソッドを呼び出す - ファイヤープロジェクト

    ネイティブコードからクラスやオブジェクトのメソッドを呼び出す. 流れ サンプル インスタンスメソッドとスタティックメソッド メソッドIDの取得とシグネチャ javap 流れメソッドを呼び出す時の流れは,フィールドの取得や設定とそんなに変わらない.以下にその流れを示す. インスタンスメソッドの場合スタティックメソッドの場合 <Type>にはメソッドの返り値の型と対応するInt,Short,Byteなどが入る. サンプル流れが掴めたところでサンプルを示す.まずはネイティブコードから呼び出されるメソッドを保持するクラス. public class Methods{ public void publicVoidMethod(){ System.out.println("publicVoidMethod()"); } static int pkgPrivateStaticIntMethod(){ i