私のCプログラムからJava関数を呼び出す簡単なプログラムを書いています。続きjuncを使ってcからJava関数を呼び出す
は私のコードです:
#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 /含める/ linuxの-L $ JAVA_HOME/JRE/libに/ AMD64 /サーバー/ ThreadPriorityTest.c
と私は次のエラーを取得しています:
/tmp/ccllsK5O.o: In function `create_vm': ThreadPriorityTest.c:(.text+0x35): undefined reference to `JNI_CreateJavaVM' collect2: ld returned 1 exit status
私はこの問題を引き起こしているものを本当にわからないんだけどUPDATE 1
は、コマンドラインで-ljvmを付属して、あなたはJavaライブラリへパスを持って、私はをRhel 6.2
http://stackoverflow.com/questions/7680415/calling-java-code-from-c-in-an-android-application – aProgrammer
を試してみましたが、未定義の参照がたくさんありました。 –
またはhttp://www.codeproject.com/Questions/263687/Linker-error-undefined-reference-to-_imp__JNI_Crea – aProgrammer