[英]JNI with Builder C++
我需要使用Java本機接口(JNI)在C ++應用程序和Java應用程序之間進行通信。
我開始與我產生JVM.Lib
從我JVM.DLL
。 為此,我使用了impdef
和implib
。 我在我的項目Builder C ++中添加了設置(包括路徑和庫路徑)。
但是,我的程序會生成
錯誤鏈接JNI_CreateJavaVM。
如何解決此錯誤? 如何在我的Application Builder C ++中使用JNI?
我成功解決了此錯誤。.我使用Coff2Omf命令生成了我的庫
coff2omf jvm.lib jvm2.lib
之后,我添加了jvm2.lib並在設置中包含路徑。
這是調用方法java的示例C ++代碼:
#include <windows.h>
#include <stdio.h>
#include <jni.h>
#include <string.h>
#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "." /* where Prog.class is */
typedef /*_JNI_IMPORT_OR_EXPORT_*/ jint (JNICALL *JNI_CreateJavaVM_func)(JavaVM **pvm, void **penv, void *args);
JNI_CreateJavaVM_func JNI_CreateJavaVM_ptr;
JNIEnv* create_vm(JavaVM ** jvm)
{
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
memset(&vm_args, 0, sizeof(vm_args));
options.optionString = "-Djava.class.path=."; //Path to the java source code
vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
HMODULE jvm_dll = LoadLibrary("C:\\Program Files (x86)\\Java\\jdk1.7.0_65\\jre\\bin\\server\\jvm.dll");
/// You might check the GetLastError() here after the LoadLibrary()
if(jvm_dll == NULL)
{
printf("can't load dll\n");
exit(1);
}
JNI_CreateJavaVM_ptr = (JNI_CreateJavaVM_func)GetProcAddress(jvm_dll, "JNI_CreateJavaVM");
/// You might check the GetLastError() here
if(JNI_CreateJavaVM_ptr == NULL)
{
printf("can't load function\n");
exit(1);
}
int ret = JNI_CreateJavaVM_ptr(jvm, (void**)&env, &vm_args);
if(ret < 0)
{
printf("\nUnable to Launch JVM\n");
}
return env;
}
int main(int argc, char* argv[])
{
JNIEnv *env;
JavaVM * jvm;
env = create_vm(&jvm);
if (env == NULL) { return 1; }
jclass cls;
jmethodID mid;
jint square;
jboolean not;
cls = (*env).FindClass("Sample2");
if(cls !=0)
{ mid = (*env).GetStaticMethodID(cls, "intMethod", "(I)I");
if(mid !=0)
{ square = (*env).CallStaticIntMethod(cls, mid, 5);
printf("Result of intMethod: %d\n", square);
}
mid = (*env).GetStaticMethodID(cls, "booleanMethod", "(Z)Z");
if(mid !=0)
{ not = (*env).CallStaticBooleanMethod( cls, mid, 1);
printf("Result of booleanMethod: %d\n", not);
}
}
int n = jvm->DestroyJavaVM();
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.