在上一篇文章中,简单的介绍了JNI的使用。上一篇主要是讲
C++调用java的静态方法的,这一篇来介绍C++调用java的普通方法的,关于JDK的环境变量设置请参考上一篇文章,这里不再赘述。只把C++代码和java代码发上来供大家参考。
public Sample()
{
//empty construct function
}
public int intMethod(int n)
{
return n*n;
}
public boolean booleanMethod(boolean bool)
{
return !bool;
}
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
int status;
jclass cls;
jobject j_object;
jmethodID mid;
jint square;
jboolean not;
options[0].optionString = "-Djava.class.path=./test.jar";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
//检查虚拟机是否创建成功
if(status == JNI_ERR)
{
printf("Can not create JavaVM!\n");
return -1;
}
//寻找类
cls = env->FindClass("test/Sample");
if(cls == 0)
{
printf("Can not find class!\n");
return -1;
}
//获得构造函数的jmethodID
jmethodID MainID = env->GetMethodID(cls,"<init>","()V");
if(MainID == 0)
{
printf("Can not get construct function id\n");
return -1;
}
//创建构造函数的对象
j_object = env->NewObject(cls,MainID);
//获得方法的jmethodID
mid = env->GetMethodID(cls,"intMethod","(I)I");
if(mid != 0)
{
//调用函数
square = (jint)env->CallObjectMethod(j_object,mid,5);
printf("Result of intMethod: %d\n", square);
}
mid = env->GetMethodID(cls,"booleanMethod","(Z)Z");
if(mid != 0)
{
not = (jboolean)env->CallObjectMethod(j_object,mid,1);
printf("Result of booleanMethod: %d\n", not);
}
//销毁虚拟机
jvm->DestroyJavaVM();
return 0;
Java:
package test;
public class Sample
{
}
C++:
#include<jni.h>
#include<string.h>
int main(int argc, char* argv[])
{
}