第一个 JNI_CreateJavaVM函数创建java虚拟机    1、classpath环境变量设置:如果机器上安装java环境,则可以getenv读出来。也可以自己指定。           主要是       jar包。注意不能单纯指定路径    2、classpath设置好了,path变量也要配置好,否则要返回-1。如果系统是自己指定目录,必须按照一       定 目录 结构,因为java是相对寻找文件的。一般按照如下          \run\              --bin                  --classic //该目录下存放执行文件,和编译好*.class文件。动态库jvm.dll                    --hpi.dll  ioser12.dll  java.dll  net.dll  verify.dll zip.dll              --lib  //jar文件                  --rt.jar tools.jar  如果要其它包可都放在这里    第二个:        JNI_CreateJavaVM   一个进程内只能调用一次,线程内JNI_GetCreatedJavaVMs获得JavaVM,       然后m_jvm->AttachCurrentThread获得 JNIEnv 环境 .软件退出时候              m_jvm->DetachCurrentThread(); m_jvm->DestroyJavaVM()可以不用//以下是我工作中的使用情况///*.h#pragma once#include class CCCallJava{public:    CCCallJava(void);    ~CCCallJava(void);    int  init_env(char *classPath);    void destroy_env();    JNIEnv* getEvn();    JavaVM* getJvm();    char* getClassPath();    int  SendZipFile(char *szUrl,char* szService,char*file);    char *jstringToWindows( JNIEnv  *env, jstring jstr );    const char* getRestult();    void GetJvmEnv(char *classpath);protected:    JNIEnv *m_env;    JavaVM *m_jvm;    char m_szClassPath[4096];    CString m_strResult;};///////////*.cpp////////////////////////////////#include "StdAfx.h"#include ".\ccalljava.h"#include "LogRecorder.h"CCCallJava::CCCallJava(void):m_env(NULL),m_jvm(NULL){}CCCallJava::~CCCallJava(void){}int CCCallJava::init_env(char *classPath){    if(m_jvm!=NULL)    {        m_Logrecorder.WriteLogF("java 已经初始化");        return 0;    }    jint res;    //取得系统环境    /*char*p =getenv("CLASSPATH");    if(p==NULL)    {        m_Logrecorder.WriteLogF("getenv 异常");        return -1;    }*/    memset(m_szClassPath,0,sizeof(m_szClassPath));    //if(classPath!=NULL)    //    sprintf(m_szClassPath,"\-Djava.class.path=%s;%s",p,classPath);    //else    //    sprintf(m_szClassPath,"\-Djava.class.path=%s",p);        //设置classpath路径    CString strClassPathTemp = classPath;    strClassPathTemp.Replace("bin\\classic","lib");    CString strClassPath = strClassPathTemp+"\\dt.jar";    strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\tools.jar";     strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\axis.jar";     strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\commons-discovery-0.2.jar";     strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\commons-logging-1.0.4.jar";     //    strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\jaxrpc.jar";     strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\saaj.jar";     strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\log4j-1.2.8.jar";     strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\axis-ant.jar";     strClassPath+=";";    strClassPath += strClassPathTemp;    strClassPath += "\\wsdl4j-1.5.1.jar";     strClassPath+=";.";    if(classPath!=NULL)        sprintf(m_szClassPath,"\-Djava.class.path=%s;%s;%s",strClassPath,classPath);    else        sprintf(m_szClassPath,"\-Djava.class.path=%s;%s",strClassPath);    JavaVMInitArgs vm_args;    JavaVMOption options[3];    memset(&vm_args, 0, sizeof(vm_args));        //进行初始化工作          options[0].optionString = "-Djava.compiler=NONE";    //options[1].optionString = "-Djava.class.path=d:\\run\\bin\\classic\\";    options[1].optionString = m_szClassPath;    options[2].optionString = "-verbose:jni";          vm_args.version=JNI_VERSION_1_4;       //版本号设置    vm_args.nOptions = 3;    vm_args.options = options;    vm_args.ignoreUnrecognized = JNI_TRUE;    res = JNI_CreateJavaVM(&m_jvm,(void**)&m_env,&vm_args); //创建JVM    if (res     {        //AfxMessageBox("虚拟机创建失败");         m_Logrecorder.WriteLogF("JNI_CreateJavaVM 失败");        return -2;    }         return 0;}void CCCallJava::GetJvmEnv(char *classpath){    JavaVM* Jvm=NULL;    jint jsize;    jint jret = JNI_GetCreatedJavaVMs(&Jvm,1,&jsize);    if(Jvm==NULL)        init_env(classpath);    else    {        m_jvm =Jvm;    //    Jvm->GetEnv((void**)&m_env,JNI_VERSION_1_4);        jint aa =m_jvm->AttachCurrentThread((void**)&m_env,NULL);            }    }void CCCallJava::destroy_env(){    if(m_jvm!=NULL)    {                //m_jvm->DetachCurrentThread();        //m_jvm->DestroyJavaVM();        //    m_jvm=NULL;                    }}JNIEnv* CCCallJava::getEvn(){    return m_env;}JavaVM* CCCallJava::getJvm(){    return m_jvm;}char* CCCallJava::getClassPath(){    return m_szClassPath;}char* CCCallJava::jstringToWindows( JNIEnv  *env, jstring jstr ){  int length = (env)->GetStringLength(jstr );  const jchar* jcstr = (env)->GetStringChars(jstr, 0 );  char* rtn = (char*)malloc( length*2+1 );  int size = 0;  size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );  if( size     return NULL;  (env)->ReleaseStringChars(jstr, jcstr );  rtn[size] = 0;  return rtn;}int  CCCallJava::SendZipFile(char *szUrl,char* szService,char*file){    // TODO: 在此添加控件通知处理程序代码    jclass cls;    jmethodID mid;    jstring jstrUrl;    jstring jstrService;    jstring jstrPathFile;    m_strResult.Empty();                //cls = env->FindClass("HelloWorld");    if(m_env==NULL)  //获得环境    {        jint aa =m_jvm->AttachCurrentThread((void**)&m_env,NULL);        if(m_env==NULL)        {            m_Logrecorder.WriteLogF("AttachCurrentThread 异常");            return -1;        }    }     //获得类句柄    cls = m_env->FindClass("SoaClient");    if((m_env->ExceptionOccurred()!=NULL)||(cls==NULL))    {        m_Logrecorder.WriteLogF("FindClass 异常");        return -1;    }    //获得类类的调用方法(静态方法)    mid = m_env->GetStaticMethodID(cls,"callsoapclient2", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");    if( (m_env->ExceptionOccurred()!=NULL)||(mid==NULL))    {         m_Logrecorder.WriteLogF("GetStaticMethodID 异常");        return -2;    }        jstrUrl = m_env->NewStringUTF(szUrl);    jstrService = m_env->NewStringUTF(szService);    jstrPathFile = m_env->NewStringUTF(file);    //调用方法    jobject jstr2 = m_env->CallStaticObjectMethod(cls, mid, jstrUrl,jstrService,jstrPathFile); //调用Java程序main()方法,启动Java程序    if( (m_env->ExceptionOccurred()!=NULL)||(jstr2==NULL))    {         m_Logrecorder.WriteLogF("CallStaticObjectMethod 连接SOA服务器 异常");        return -2;    }    const char *cmsg;        char *pCBuf = jstringToWindows(m_env,(jstring)jstr2);    m_strResult = pCBuf;    #ifdef _DEBUG    FILE *fp=fopen("d:\\a1.txt","w");    fwrite(pCBuf,1,strlen(pCBuf),fp);    fclose(fp);    #endif    free(pCBuf);    pCBuf=NULL;    return 0 ;}const char* CCCallJava::getRestult(){    return m_strResult;}/////////////////相应的java类import javax.xml.namespace.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import java.util.ArrayList;///////////import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.IOException;public class SoaClient{        public static String  callsoapclient2(String serverUrl,String ServerService,String files)    {        String sResult = null;        String sTargetEndpointAddress = serverUrl;        Service service = new Service();        Call call = null;        try        {                call = (Call) service.createCall();                call.setTargetEndpointAddress(new java.net.URL(    sTargetEndpointAddress));                call.setOperationName(new QName("http://service.wcm.trs.com",ServerService));                                sResult = (String) call.invoke(new Object[] { CMyFile.readBytesFromFile(files), "zip" });                 //sResult = (String) call.invoke(new Object[] { CMyFile.readBytesFromFile("D:\\data0.zip"), "zip" });                     //sResult=sTargetEndpointAddress;        }catch (Exception e)        {            e.printStackTrace();        }        return sResult;    }}class CMyFile{    public CMyFile()    {    }    public static byte[] readBytesFromFile(String _sFileName)        throws IOException    {        FileInputStream fis = null;        ByteArrayOutputStream bos = null;        try        {            fis = new FileInputStream(_sFileName);            byte buffer[] = new byte[1024];            bos = new ByteArrayOutputStream(2048);            for(int nLen = 0; (nLen = fis.read(buffer)) > 0;)                bos.write(buffer, 0, nLen);            return bos.toByteArray();        }        catch(Exception e) { }        try        {            if(fis != null)                fis.close();            if(bos != null)                bos.close();        }        catch(Exception e) {             e.printStackTrace();        }        return null;           }}
11-04 14:59
查看更多