c 调用 java 时,java 程序常常 是依赖多个jar包的,关键是 如何要告诉jvm jar包的路径。
先写c代码:
1 c代码
写调用JAVA 的C++ 代码(main.cpp)如下:
#include <iostream>
#include <jni.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif
using namespace std;
int main()
{
JavaVMOption options[3];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
jboolean not1;
jobject jobj;
options[0].optionString = "-Djava.class.path=/home/cInvokeJavaLinux/refjar";
options[1].optionString="-verbose:jni";
options[2].optionString="-Djava.ext.dirs=/home/cInvokeJavaLinux/refjar";
vm_args.version =JNI_VERSION_1_6;// JNI_VERSION_1_2;
vm_args.nOptions = 3;
vm_args.options = options;
/* options[0].optionString = "-Djava.class.path=.";
vm_args.version =JNI_VERSION_1_6;// JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.options = options;
*/
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
/*
if (status != JNI_ERR)
{
cls = env->FindClass("com/testJni/testDemo/C2java");
if(cls !=0)
{
mid = env->GetStaticMethodID( cls, "add", "(II)I");
if(mid !=0)
{
square = env->CallStaticIntMethod( cls, mid, 5,5);
std::cout << square << std::endl;
}
mid = env->GetMethodID(cls,"<init>","()V");
if(mid !=0)
{
jobj=env->NewObject(cls,mid);
std::cout << "init ok" << std::endl;
}
mid = env->GetMethodID( cls, "judge",