CPP通过JNI调用JAVA函数Demo

2014-11-24 01:00:19 · 作者: · 浏览: 1

首先我们来看看我们的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 
  
   
#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();//释放虚拟机 } 
   
  
好了就是这么简单.最后附上本Demo的工程 下载传送门:http://t.cn/8syetyV
本人郑重声明如下 一、本文来自CSDN博客,传送门:http://BlOG.CSDN.NET/yirancpp 二、All Rights Reserved. 任何个人或网站转载本文时不得移除本声明. 三、不得对文章进行修改,除非明确说明.同时欢迎大家评论转载和分享.