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