CPP通过JNI调用JAVA函数Demo

首先我们来看看我们的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
本人郑重声明如下 一、本文来自CSDN博客,传送门:http://BlOG.CSDN.NET/yirancpp 二、All Rights Reserved. 任何个人或网站转载本文时不得移除本声明. 三、不得对文章进行修改,除非明确说明.同时欢迎大家评论转载和分享.
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页