크로스 플랫폼 개발 영역에서는 C 애플리케이션이 Java 메소드에서 제공하는 기능에 액세스해야 하는 경우가 있습니다. 이 쿼리는 이러한 통합을 달성하기 위한 타당성과 미묘한 차이를 탐구합니다.
타당성 및 메커니즘
예, C/C 코드 내에서 Java 메소드를 호출할 수 있습니다. 그러나 절차는 다소 복잡하며 반사적이고 유형이 안전하지 않은 접근 방식을 따릅니다.
C API(응용 프로그래밍 인터페이스)는 이러한 통합을 달성하기 위한 더 깔끔한 방법을 제공합니다. 이 접근 방식에는 C 코드 내에서 JVM(Java Virtual Machine)을 인스턴스화하는 작업이 포함됩니다. 네이티브 코드가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!