5

iOS で静的ライブラリとして再利用したい大量の Java コード (計算関数のみ、UI なし) があります。私のアプローチは、robovmを使用し、robovm フォーラムの 2 つの記事 ( 1 基本的な方法2 洗練されたバージョン) で説明されている静的ライブラリを作成する非公式の方法に従うことでした。

説明されている手順を正確に実行しようとすると、共有ライブラリをスクリプトで作成し、Xcode でライブラリ (.a) をリンクしてプロジェクトを正常にビルドした後、残念ながら行き詰まりました。

実行時に、C++ ブリッジ コードが呼び出されていることがわかりますが、ライブラリへの JNI コールバックは BAD_ACCESS で失敗します。たとえば、次の行はクラッシュします。

jclass myJavaClass = jniEnv->FindClass("com/test/robovm/bridge/MyJavaRoboCode");

この方法では:

void callSomethingInJava(const char* arg) {
    // To call into java from your native app, use JNI
    Env* rvmEnv = rvmGetEnv();
    JNIEnv* jniEnv = &(rvmEnv->jni);
    jclass myJavaClass = jniEnv->FindClass("com/test/robovm/bridge/MyJavaRoboCode");
    jmethodID myJavaMethod = jniEnv->GetStaticMethodID(myJavaClass, "callJava", "(Ljava/lang/String;)V");
    jstring argAsJavaString = jniEnv->NewStringUTF(arg);
    jniEnv->CallStaticVoidMethod(myJavaClass, myJavaMethod, argAsJavaString);

}

JNI の代わりに rvmXX メソッドを直接使用して、「Java」クラスの何かにアクセスしようとした場合も同様です。rvmEnv が完全に初期化されていないようです。(パッケージ名のエラーやタイプミスを再確認しました)。

誰かがすでに robovm プロジェクトからの共有静的ライブラリの作成に成功しており、ここでその経験を共有したり、問題を解決するための正しい方向を教えてくれたりできれば幸いです。

4

1 に答える 1

3

あなたが言ったように、おそらく robovm の初期化が完了していません。

bc.c のメイン メソッドを多少反映するために、initRoboVM() などのメソッドを作成する必要があります。これは、robovm を初期化するときにコードによって呼び出されます。アプリのパスを渡す必要があります。これは、テスト時にハードコーディングできます。

initRoboVM() にはいくつかの変更が必要です。つまり、Java アプリのメイン メソッドを呼び出すべきではありません。少なくとも、これは適切に動作するライブラリが IMO を実行してはならないことです。また、rvmShutdown を呼び出すべきではありません。

于 2014-08-01T11:24:07.990 に答える