有些库是使用java语言编写的,C++要调用java的类,实现方法如下
C++代码:
#include"stdafx.h"
#include<windows.h>
#include<stdio.h>
#include<jni.h>
#include<string.h>
#definePATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#defineUSER_CLASSPATH "." /* where Prog.class is */
typedef/*_JNI_IMPORT_OR_EXPORT_*/ jint (JNICALL *JNI_CreateJavaVM_func)(JavaVM **pvm,void **penv, void *args);
JNI_CreateJavaVM_funcJNI_CreateJavaVM_ptr;
JNIEnv*create_vm(JavaVM ** jvm)
{
JNIEnv*env;
JavaVMInitArgsvm_args;
JavaVMOptionoptions;
options.optionString ="-Djava.class.path=E:\\新建文件夹\\TestFindClass3\\bin"; //注意:该路径不能包含包名程
vm_args.version= JNI_VERSION_1_8; //JDK version. This indicates version 1.8
vm_args.nOptions= 1;
vm_args.options= &options;
vm_args.ignoreUnrecognized= 0;
HMODULEjvm_dll = LoadLibrary(_T("C:\\ProgramFiles\\Java\\jdk1.8.0_144\\jre\\bin\\server\\jvm.dll"));
///You might check the GetLastError() here after the LoadLibrary()
if(jvm_dll== NULL)
{
printf("can'tload dll\n"); exit(1);
}
JNI_CreateJavaVM_ptr= (JNI_CreateJavaVM_func)GetProcAddress(jvm_dll, "JNI_CreateJavaVM");
//JNI_CreateJavaVM_ptr= (JNI_CreateJavaVM_func)GetProcAddress(jvm_dll,"MultiFormatWriter");
///You might check the GetLastError() here
if(JNI_CreateJavaVM_ptr== NULL) { printf("can't load function\n"); exit(1); }
intret = JNI_CreateJavaVM_ptr(jvm, (void**)&env, &vm_args);
if(ret< 0) { printf("\nUnable to Launch JVM\n"); }
returnenv;
}
int main(int argc,char* argv[])
{
JNIEnv*env;
JavaVM* jvm;
env= create_vm(&jvm);
if(env == NULL) { return 1; }
jclasscls;
jmethodIDmid;
jintsquare;
jbooleannot;
cls =(*env).FindClass("buxin/buxinplus"); //注意:该处要包含包的名称,其中“buxinplus”为.class类型的文件
if(!cls)
{
printf("Classnot found\n");
return-1;
}
printf("test1,cls=%d...\n",cls);
if(cls!=0)
{
/*
查找 Java方法
接下来,我们希望用 GetStaticMethodID()函数在该类中查找某个方法。
我们希望查找方法 intMethod,它接收一个 int 参数并返回一个 int。
以下是查找 intMethod的代码:
*/
mid= (*env).GetStaticMethodID(cls, "intMethod", "(I)I");
/*
mid变量存储执行GetStaticMethodID()函数后的结果。
如果找到了该方法,则 mid变量表示该方法的句柄。
如果不能找到该方法,则mid将为零。
*/
if(mid!=0)
{
/*CallStaticIntMethod()方法接受 cls(表示类)、mid(表示方法)以及用于该方法一个或多个参数。
在本例中参数是 int 5。*/
square= (*env).CallStaticIntMethod(cls, mid, 5);
printf("Resultof intMethod: %d\n", square);
}
mid= (*env).GetStaticMethodID(cls, "booleanMethod","(Z)Z");
if(mid!=0)
{
not= (*env).CallStaticBooleanMethod(cls, mid, 1);
printf("Resultof booleanMethod: %d\n", not);
}
}
intn = jvm->DestroyJavaVM();
return0;
}
java代码:
package buxin;
public classbuxinplus {
public static int intMethod(int n,int m){
return n*m;
}
public static boolean booleanMethod(booleanbool) {
return !bool;
}
}