gpt4 book ai didi

java - 如何在 C++ 应用程序中访问 Java 方法

转载 作者:IT老高 更新时间:2023-10-28 12:50:01 26 4
gpt4 key购买 nike

只是一个简单的问题:是否可以从 c/c++ 调用 java 函数?

最佳答案

是的,你可以,但它有点复杂,并且以反射/非类型安全的方式工作(示例使用比 C 版本更简洁的 C++ api)。在这种情况下,它从 C 代码中创建 Java VM 的实例。如果您的 native 代码首先从 Java 调用,则无需构造 VM 实例

#include<jni.h>
#include<stdio.h>

int main(int argc, char** argv) {

JavaVM *vm;
JNIEnv *env;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = 1;

// Construct a VM
jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

// Construct a String
jstring jstr = env->NewStringUTF("Hello World");

// First get the class that contains the method you need to call
jclass clazz = env->FindClass("java/lang/String");

// Get the method that you want to call
jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase",
"()Ljava/lang/String;");
// Call the method on the object
jobject result = env->CallObjectMethod(jstr, to_lower);

// Get a C-style string
const char* str = env->GetStringUTFChars((jstring) result, NULL);

printf("%s\n", str);

// Clean up
env->ReleaseStringUTFChars(jstr, str);

// Shutdown the VM.
vm->DestroyJavaVM();
}

编译(在 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

注意:为了实现正确的错误处理,应该检查每个方法的返回码(为方便起见,我忽略了这一点)。例如

str = env->GetStringUTFChars(jstr, NULL);
if (str == NULL) {
return; /* out of memory */
}

关于java - 如何在 C++ 应用程序中访问 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/992836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com