クロスプラットフォーム開発の領域では、C アプリケーションが Java メソッドによって提供される機能にアクセスする必要がある場合があります。このクエリは、この統合を実現する実現可能性とニュアンスを調査します。
実現可能性とメカニズム
はい、C/C コード内から Java メソッドを呼び出すことができます。ただし、この手順はやや複雑で、リフレクティブで非タイプセーフなアプローチに準拠しています。
C アプリケーション プログラミング インターフェイス (API) は、この統合を実現するためのよりクリーンな方法を提供します。このアプローチには、C コード内で Java 仮想マシン (JVM) をインスタンス化することが含まれます。ネイティブ コードが Java から呼び出されるシナリオでは、VM インスタンスを構築する必要はありません。
実装
提供されたコード スニペットは、C から Java メソッドを呼び出す方法を示しています。アプリケーション:
#include <jni.h> #include <stdio.h> int main() { JavaVM *vm; // Pointer to JVM JNIEnv *env; // JNI interface to interact with JVM JavaVMInitArgs vm_args; // JVM initialization arguments // Initialize JVM arguments vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 0; vm_args.ignoreUnrecognized = 1; // Construct a Java Virtual Machine jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args); // Create a Java string object jstring jstr = env->NewStringUTF("Hello World"); // Get the "java/lang/String" class jclass clazz = env->FindClass("java/lang/String"); // Get the "toLowerCase()" method ID jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;"); // Invoke the "toLowerCase()" method on the string object jobject result = env->CallObjectMethod(jstr, to_lower); // Convert the Java string to a C-style string const char* str = env->GetStringUTFChars((jstring) result, NULL); // Print the converted string printf("%s\n", str); // Release the C-style string env->ReleaseStringUTFChars(jstr, str); // Destroy the Java Virtual Machine vm->DestroyJavaVM(); return EXIT_SUCCESS; }
クロスプラットフォームコンパイル
Ubuntu でのクロスプラットフォーム コンパイルの場合は、次のコマンドを実行します。
g++ -I/usr/lib/jvm/java-6-sun/include \ -I/usr/lib/jvm/java-6-sun/include/linux \ -L/usr/lib/jvm/java-6-sun/jre/lib/i386/server/ -ljvm jnitest.cc
エラー処理
適切なエラー処理に使用されるすべてのメソッドの戻りコードを確認してください。たとえば、次のコード スニペットは、C スタイルの文字列を取得するときに潜在的なメモリ割り当ての問題をチェックします:
str = env->GetStringUTFChars(jstr, NULL); if (str == NULL) { return EXIT_FAILURE; /* out of memory */ }
以上がC アプリケーションから Java メソッドを呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。