C++调用java

有些库是使用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; 

   }

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++调用Java接口,需要使用Java Native Interface (JNI)。 以下是一些基本步骤: 1. 编写Java代码并编译成Java类文件。 2. 使用Javajavah命令生成一个C头文件,该头文件包含了Java类的接口定义。 3. 在C++代码中包含该头文件,并编写与Java接口对应的C++函数。 4. 在C++代码中使用JNI函数来连接Java虚拟机,并调用Java接口。 以下是一个简单的示例,演示如何在C++调用Java的Math类: Java代码: ``` public class MathHelper { public static double add(double a, double b) { return a + b; } } ``` 生成C头文件: ``` javah MathHelper ``` 得到MathHelper.h文件: ``` /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class MathHelper */ #ifndef _Included_MathHelper #define _Included_MathHelper #ifdef __cplusplus extern "C" { #endif /* * Class: MathHelper * Method: add * Signature: (DD)D */ JNIEXPORT jdouble JNICALL Java_MathHelper_add (JNIEnv *, jclass, jdouble, jdouble); #ifdef __cplusplus } #endif #endif ``` C++代码: ``` #include <jni.h> #include <stdio.h> #include "MathHelper.h" int main() { JavaVM *jvm; // Java虚拟机实例 JNIEnv *env; // JNI环境 JavaVMInitArgs vm_args; // Java虚拟机启动参数 JavaVMOption options[1]; // Java虚拟机选项 jclass mathClass; // Java类 jmethodID addMethod; // Java方法 jdouble a = 3.5, b = 2.7, result; // 输入和输出参数 // 设置Java虚拟机选项 options[0].optionString = "-Djava.class.path=."; // 设置类路径 vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_FALSE; // 创建Java虚拟机 JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // 加载Java类 mathClass = env->FindClass("MathHelper"); // 获取Java方法 addMethod = env->GetStaticMethodID(mathClass, "add", "(DD)D"); // 调用Java方法 result = env->CallStaticDoubleMethod(mathClass, addMethod, a, b); // 打印结果 printf("%f + %f = %f\n", a, b, result); // 销毁Java虚拟机 jvm->DestroyJavaVM(); return 0; } ``` 注意:在运行C++代码前,需要先将MathHelper.class文件放在当前目录下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值