从C使用JNI调用Java函数 [英] calling java function from c using jni

查看:110
本文介绍了从C使用JNI调用Java函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在写一个简单的程序,从我的C程序中调用Java函数。

I'm writing a simple program to call a Java function from my C program.

以下是我的code:

#include <jni.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <stdlib.h>

JNIEnv* create_vm() {
    JavaVM* jvm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;

    JavaVMOption options[1];

    options[0].optionString - "-Djava.class.path=/home/chanders/workspace/Samples/src/ThreadPriorityTest";
    vm_args.version = JNI_VERSION_1_6;
    vm_args.nOptions = 1;
    vm_args.options = &options;
    vm_args.ignoreUnrecognized = JNI_FALSE;

    JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    return env;
}

void invoke_class(JNIEnv* env) {
    jclass helloWorldClass;
    jmethodID mainMethod;
    jobjectArray applicationArgs;
    jstring applicationArg0;

    helloWorldClass = (*env)->FindClass(env, "InvocationHelloWorld");
    mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V");

    applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/String"), NULL);
    applicationArg0 = (*env)->NewStringUTF(env, "From-C-program");
    (*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0);
    (*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs);
}

int main() {
    JNIEnv* env = create_vm();
    invoke_class(env);
}

我编译使用上述程序:
GCC -o调用-I $ JAVA_HOME /有/ -I $ JAVA_HOME /在include / linux -L $ JAVA_HOME / JRE / lib中/ AMD64 /服务器/ ThreadPriorityTest.c

I'm compiling the above program using: gcc -o invoke -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux -L$JAVA_HOME/jre/lib/amd64/server/ ThreadPriorityTest.c

和我得到了以下错误:

/tmp/ccllsK5O.o: In function `create_vm': ThreadPriorityTest.c:(.text+0x35): undefined reference to `JNI_CreateJavaVM' collect2: ld returned 1 exit status

我真的不知道是什么原因造成这个问题。

I'm not really sure what is causing this problem

更新1

包含在命令行中-ljvm,然后得到了一个未定义的引用FUNCTION_NAME
我运行它在RHEL 6.2

Included the -ljvm in the command line and then got a undefined reference to FUNCTION_NAME I'm running it on Rhel 6.2

推荐答案

您已经得到了的路径应用于Java库(即 -L 选项),但不库本身。您需要包括 -ljvm 链接线也是如此。

You've got the path to the Java library (the -L option), but not the library itself. You need to include -ljvm on the link line as well.

这篇关于从C使用JNI调用Java函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆