c++中调用如何调用java

xlb随心所欲 发布于 2014/05/10 20:26
阅读 888
收藏 0
我想要在c++调用java的方法,但是始终报错。
jclass cls = env->FindClass("test/Demo"); 
    //根据类的CLASS对象获取该类的实例  
    jobject obj = env->AllocObject(cls); 执行到这边报错了,求大神帮忙看看

下面程序完全参考http://public0821.iteye.com/blog/423941,但是自己试了试都不成功。

#include "windows.h"  
#include "jni.h"  
#include <string>  
#include <iostream>  
using namespace std;  
  
jstring NewJString(JNIEnv *env, LPCTSTR str);  
string  JStringToCString (JNIEnv *env, jstring str);  
  
int main()  
{   
typedef jint (WINAPI *PFunCreateJavaVM)(JavaVM **, void **, void *);  
    int res;  
    JavaVMInitArgs vm_args;  
    JavaVMOption options[3];  
    JavaVM *jvm;  
    JNIEnv *env;  
    options[0].optionString = "-Djava.compiler=NONE";  
    options[1].optionString = "-Djava.class.path=.;c:\\";   
    options[2].optionString = "-verbose:NONE";  
         
    vm_args.version = JNI_VERSION_1_4;  
    vm_args.nOptions = 3;  
    vm_args.options = options;  
    vm_args.ignoreUnrecognized = JNI_TRUE;  
    HINSTANCE hInstance = ::LoadLibrary("C:\\Program Files\\Java\\jdk1.6.0_25\\jre\\bin\\server\\jvm.dll");  
    if (hInstance == NULL)  
    {  
        return false;  
    }   
    PFunCreateJavaVM funCreateJavaVM = (PFunCreateJavaVM)::GetProcAddress(hInstance, "JNI_CreateJavaVM");  
    res = (*funCreateJavaVM)(&jvm, (void**)&env, &vm_args);  
    if (res < 0)  
    {  
        return -1;  
    }  
    jclass cls = env->FindClass("test/Demo"); 
    jobject obj = env->AllocObject(cls);  
    jmethodID mid = env->GetMethodID(cls, "append","(Ljava/lang/String;I)Ljava/lang/String;");  
    const char szTest[] = "电信";  
    jstring arg = NewJString(env, szTest);  
    jstring msg = (jstring) env->CallObjectMethod(obj, mid, arg, 12);  
    cout<<JStringToCString(env, msg);  
    jvm->DestroyJavaVM();  
    ::FreeLibrary(hInstance);  
    return 0;  
}  
  
string  JStringToCString (JNIEnv *env, jstring str)// (jstring str, LPTSTR desc, int desc_len)  
{  
    if(str==NULL)  
    {  
        return "";  
    }  
    //在VC中wchar_t是用来存储宽字节字符(UNICODE)的数据类型  
    int len = env->GetStringLength(str);  
    wchar_t *w_buffer = new wchar_t[len+1];  
    char *c_buffer = new char[2*len+1];  
    ZeroMemory(w_buffer,(len+1)*sizeof(wchar_t));  
    //使用GetStringChars而不是GetStringUTFChars  
    const jchar * jcharString = env->GetStringChars(str, 0);  
    wcscpy(w_buffer,jcharString);     
    env->ReleaseStringChars(str,jcharString);  
    ZeroMemory(c_buffer,(2*len+1)*sizeof(char));  
    //调用字符编码转换函数(Win32 API)将UNICODE转为ASCII编码格式字符串  
    len = WideCharToMultiByte(CP_ACP,0,w_buffer,len,c_buffer,2*len,NULL,NULL);  
    string cstr = c_buffer;  
    delete[] w_buffer;  
    delete[] c_buffer;  
      
    return cstr;  
}  
  
jstring NewJString(JNIEnv *env, LPCTSTR str)  
{  
    if(!env || !str)  
    {  
        return 0;  
    }  
    int slen = strlen(str);  
    jchar* buffer = new jchar[slen];  
    int len = MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,slen);  
    if(len>0 && len < slen)  
    {  
        buffer[len]=0;  
    }  
    jstring js = env->NewString(buffer,len);  
    delete [] buffer;  
    return js;  
}  


加载中
0
宏哥
宏哥

两种最奇葩的语言居然搅一起了

为什么不用 c + lua 或者 c+python,  c + PHP

任何都好, 用c++ 和 java 搞, 搞死人的

雷神雨石
雷神雨石
会搞死的,宏哥是复活过来的!
0
风自云
风自云
C艹居然可以调Java?!
0
Gmail.com
Gmail.com

把Java程序包装成可执行jar文件

然后在C++里调用命令行"java -jar xxx.jar"......

0
您的好友
您的好友
。。。。。。。 不知道。。没试过。。
0
鸟人会飞

webservice

听过没用过

返回顶部
顶部