当前位置: 首页 > 面试题库 >

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

薛欣荣
2023-03-14
问题内容

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


问题答案:

是的,你可以,但是它有点令人费解,并且以反射/非类型安全的方式工作(示例使用的C ++ API比C版本更干净)。在这种情况下,它将从C代码中创建Java VM的实例。如果首先从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 */
}


 类似资料:
  • 在WP8.1中创建了一个集线器应用程序,我有一个列表视图,当按下appbar按钮时,我需要修改选择模式。我无法访问后面的。cs代码中给listview的x:name。我已经在一个正常的页面上工作了,只是在集线器应用程序中不工作。 我无法访问C#中的x:name=“WeatherListView”来更改selectionmode 私有void WeatherRemoveAppBarButton_On

  • 我正在使用Spring Boot和Spring data jpa。我也在使用hibernate envers,我需要访问AuditReaderFactory,以便我可以编写审计查询。 因为它是Spring Boot和spring数据jpa,所以一切都是自动配置的。所以当我这么做的时候, 它不起作用。我得到以下错误。 如何在我的存储库类中获得对AuditReaderFactory的正确引用?

  • 我的问题很简单,也很直观,但几个星期都解决不了。 我在Windows8上使用Docker。(当然是Docker工具箱+VirtualBox)。我把图像推到Docker Hub并使用Kitematic部署R shiny应用程序。 上面的图片显示它正在运行,但我无法通过给定的Docker机器IP 192.168.99.100:32772访问它

  • 问题内容: 我想使用Play Framework 2.4 中的Guice 类的方法,如何访问它? 我已经使用Guice 实现了一个工厂,该工厂在运行时返回了另一个工厂!在返回工厂的第二层,我需要访问Play Guice Injector以使用反射而不是注释来手动获取对象。 问题答案: 有很多方法。我用这个。 编辑:这与<= 2.4的Play版本有关: 要么 对于> = 2.5的版本:

  • 问题内容: 如何在CLI(命令行界面)Java应用程序中截获 (通常会杀死进程)? 是否存在多平台解决方案(Linux,Solaris,Windows)? 我使用的是,但是如有必要,我可以使用其他方法从标准输入中读取字符。 问题答案: 这应该能够截获信号,但是仅作为JVM完全关闭自身之前的中间步骤,因此它可能不是你要注意的。 你需要使用截获 触发的信号C(在Unix和Windows上)。

  • 我正在用c开发一个应用程序,我想使用solr来索引sqlite数据库,我在网上搜索了一下,发现我需要使用JNI:http://randr . svbtle . com/experiment-with-embedded-Solr-in-Java-and-c,但是我发现jar有很多问题(我使用了\solr-4.9.0\dist\solrj-lib和\solr-4.9.0\dist和\solr-4.9.