首先我们来看看我们的JAVA文件中的两个函数.这两个函数都很简单.注意都是静态的哦
package mm.nn.oo;
public class CJava
{
public static String GetStr()
{
return "THIS STRING IS FROM JAVA!!!";
}
public static int Add(int m, int n)
{
return m + n;
}
}
然后通过JAVAC命令生成对应的.CLASS文件放在与包名对应的目录mm\nn\n\oo下即可.我们新建一个CPP工程在属性=》配置属性=》VC++目录中添加JNI所在的目录:$(JAVA_HOME)\include\win32和$(JAVA_HOME)\include.在库目录添加创建JAVA VM需要的库的目录:%JAVA_HOME%\lib.然后我们的CPP代码看起来像是这样子的:
#include<stdlib.h>
#include<jni.h>
#pragma comment(lib,"jvm")
int main()
{
JavaVM *pJvm;//虚拟机指针
JNIEnv *pEnv;//环境指针
JavaVMInitArgs VM_Args;
JavaVMOption Options[3];
VM_Args.version=JNI_VERSION_1_2;//这个字段必须设置为该值
Options[0].optionString="-Djava.compiler=NONE";//禁止JIT编译器的加载
Options[1].optionString="-Djava.class.path=."; //.CLASS文件的路径
Options[2].optionString ="-verbose:jni";//用于跟踪运行时的信息
VM_Args.version=JNI_VERSION_1_2;//版本号
VM_Args.nOptions= 3;
VM_Args.options=Options;
VM_Args.ignoreUnrecognized=JNI_TRUE;
if (JNI_CreateJavaVM(&pJvm,(void**)&pEnv,&VM_Args)!=JNI_ERR)
{
jclass JCls=pEnv->FindClass("mm/nn/oo/CJava");
system("CLS");
printf("*************************************************\n");
if(JCls!=0)
{
jmethodID pMID=pEnv->GetStaticMethodID(JCls,"Add","(II)I");
if(pMID!=0)
{
printf("%i\n",pEnv->CallStaticIntMethod(JCls,pMID,5,5));
}
pMID=pEnv->GetStaticMethodID(JCls,"GetStr","()Ljava/lang/String;");
if (pMID!=0)
{
jstring TempStr=(jstring)pEnv->CallStaticObjectMethod(JCls,pMID);
const char* pTemp=pEnv->GetStringUTFChars(TempStr,0);
printf("%s\n",pTemp);
pEnv->ReleaseStringUTFChars(TempStr,pTemp);
}
pEnv->DeleteLocalRef(JCls);
}
}
pJvm->DestroyJavaVM();//释放虚拟机
}
好了就是这么简单.最后附上本Demo的工程下载传送门:
http://t.cn/8syetyV