首先我们来看看我们的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调用.我们新建一个CPP工程在属性=》配置属性=》VC++目录中添加JNI所在的目录:$(JAVA_HOME)\include\win32和$(JAVA_HOME)\include.在库目录添加创建JAVA VM需要的库的目录:%JAVA_HOME%\lib.然后我们的CPP代码看起来像是这样子的:
#include好了就是这么简单.最后附上本Demo的工程 下载传送门:http://t.cn/8syetyV#include #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();//释放虚拟机 }