c++调用java接口

最近遇到一个项目,要调用java的接口。目前只能调用java的接口,对于有jar包的接口还需要进一步探索,先上代码,每一步都有注释

typedef jint (WINAPI *PFunCreateJavaVM)(JavaVM **, void **, void *);

int res;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
JavaVM *jvm;
JNIEnv *env;

/*设置初始化参数*/
//disable JIT,这是JNI文档中的解释,具体意义不是很清楚 ,能取哪些值也不清楚。
//从JNI文档里给的示例代码中搬过来的
options[0].optionString = "-Djava.compiler=NONE";
//设置classpath,如果程序用到了第三方的JAR包,也可以在这里面包含进来
options[1].optionString = "-Djava.class.path=..\\;
//设置显示消息的类型,取值有gc、class和jni,如果一次取多个的话值之间用逗号格开,如-verbose:gc,class
//该参数可以用来观察C++调用JAVA的过程,设置该参数后,程序会在标准输出设备上打印调用的相关信息
options[2].optionString = "-verbose:NONE";
//options[2].optionString = "-Xmx1024m";  // 最大堆大小



vm_args.version = JNI_VERSION_1_6; 
vm_args.nOptions = 1; 
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;   


//加载JVM.DLL动态库 这里如果失败,1jdk版本问题64位,32位的问题,2缺少系统库。可以用depend查看缺少哪些库,网上下载,这里用到绝对路径,。。。很头疼,目前没有找到其他代替的方法
HINSTANCE hInstance = ::LoadLibrary(_T("C:\\Program Files (x86)\\Java\\jre1.8.0_291\\bin\\client\\jvm.dll"));
if (hInstance == NULL)
{
	printf("error = %d\n", GetLastError());
	return false;
}
//取得里面的JNI_CreateJavaVM函数指针
PFunCreateJavaVM funCreateJavaVM = (PFunCreateJavaVM)::GetProcAddress(hInstance, "JNI_CreateJavaVM");
//调用JNI_CreateJavaVM创建虚拟机
res = (*funCreateJavaVM)(&jvm, (void**)&env, &vm_args);
if (res < 0)
{
	return -1;
}

//步骤1:
wchar_t exeFullPath[MAX_PATH]; // Full path 
GetModuleFileName(NULL,exeFullPath,MAX_PATH); 

//strcat((exeFullPath, JNI_CLASS_PATH);

USES_CONVERSION;

//返回JAVA类的CLASS对象 
jclass  clazz = env->FindClass("Hello");    //找到对应的类
//根据类的CLASS对象获取该类的实例
jobject obj1 = env->AllocObject(clazz);

//步骤2:<init>是java的构造函数名,这个有点特殊。在我的一篇文章jetpack中的问题中碰见过它。
//构造函数没输入输出参数,所以这里的signature填写为()V
jmethodID method_init_id = env->GetMethodID(clazz,"<init>","()V");//拿到构造方法
jmethodID method_get_id = env->GetStaticMethodID(clazz,"sayHello","()I");//拿到构造方法  ,对应的方法函数
jmethodID midCalling = env->GetStaticMethodID(clazz,"callsm4","()Ljava/lang/String;");  //参数说明,第一个参数类的对象,第二个:方法的名称,函数的名称,第三个参数:签名。函数所需参数,转换对应相关表格
//()Ljava/lang/String; 签名方法可以打开对应java项目的class目录,在控制台输入javap -s -p xxxx.class 查看


//步骤3:
//创建了类的对象
//jobject  obj = env->NewObject(clazz,method_init_id);

//步骤4:调用相应的方法
//env->CallVoidMethod(obj,method_set_id,21);//set函数没返回值
jint i = env->CallStaticIntMethod(clazz,method_get_id);
//jobject str1 = env->CallStaticObjectMethod(clazz,midCalling);//这个接口里面用到了jar包的接口,有点难搞,目前返回值是空

//printf("str1 = %s\n", str1);


//销毁虚拟机并释放动态库
jvm->DestroyJavaVM();
::FreeLibrary(hInstance);

不知是否还要其他方法可以调用,网上查来查去,就这个方法还能调用成功,遇到jar包的调用还不成功,希望路过的高手指点一二,万分感谢!!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值