本帖最后由 xiaoxiong5227 于 2011-06-01 15:08:27 编辑

解决方案 »

  1.   

    C++的代码如下:
    #include <windows.h>
    #include <jni.h>
    #include <iostream>#pragma comment( lib, "jvm.lib" )
    int main()
    {
        JavaVMOption options;
        options.optionString = "-Djava.class.path=."; 
        
        JNIEnv* env = NULL;
        JavaVM* jvm = NULL;    JavaVMInitArgs vm_args;
        RtlZeroMemory( & vm_args, sizeof( JavaVMInitArgs ) );
        
        vm_args.version            = JNI_VERSION_1_6;
        vm_args.nOptions           = 1;
        vm_args.options            = & options;
        vm_args.ignoreUnrecognized = TRUE;    long status = JNI_CreateJavaVM( & jvm, ( void** ) & env, & vm_args  );//调用虚拟机
        if ( status == JNI_ERR ) {
            std::cout << "JNI_CreateJavaVM( ... ) failed ! Return code " << status << " ! " << std::endl;
            return 1;
        }
        
        jclass cls = env->FindClass( "RtfReader" );//判断类是否存在
        if ( cls == 0 ) {
            std::cout << "No such class RtfReader !" << std::endl;
            jvm->DestroyJavaVM();
            return 1;
        }
        
        jmethodID mid = env->GetStaticMethodID( cls, "getTextFromRtf", "(Ljava/lang/String;)Ljava/lang/String;" );//判断具体的函数
        if ( mid == 0 ) {
            std::cout << "No such class Method getTextFromRtf !" << std::endl;
            jvm->DestroyJavaVM();
        }
        
        std::string strUTF8;
        std::string strNew = "Hello ! 我是来自 C++ 的 String !";
        
    mid = env->GetStaticMethodID(cls, "getTextFromRtf", "(C)C");
            if (mid !=0)
            {
                printf("testPrintn");
                env->CallStaticVoidMethod(cls, mid,"C:\\test.rtf");
            }
        
        jvm->DestroyJavaVM();
        return 0;
    }
      

  2.   

    mid = env->GetStaticMethodID(cls, "getTextFromRtf", "(C)C");
            if (mid !=0)
            {
                printf("testPrintn");
                env->CallStaticVoidMethod(cls, mid,"C:\\test.rtf");
            }的值一直为0,求高手解答啊
      

  3.   

    看你的RtfReader类,只有getTextFromRtf,(Ljava/lang/String;)Ljava/lang/String; 的静态方法。
    没有 getTextFromRtf,(C)C呀。
      

  4.   

    mid = env->GetStaticMethodID(cls, "getTextFromRtf", "(Ljava/lang/String;)V");
            if (mid !=0)
            {
                env->CallStaticVoidMethod(cls, mid,"C:\\test.rtf");
            }
        改成上面的代码之后,运行出错了。
      

  5.   

    import java.io.IOException;   
    import java.io.InputStream;   
          
    import javax.swing.text.BadLocationException;   
    import javax.swing.text.DefaultStyledDocument;   
    import javax.swing.text.rtf.RTFEditorKit;   
          
          
    public class RtfReader {   
            public RtfReader(){   
            }   
            /**  
             * @param filePath 文件路径  
             * @return 读出的rtf的内容  
             */  
            public static void getTextFromRtf(String filePath) {   
                String result = null; 
                File file = new File(filePath);   
                try {          
                    DefaultStyledDocument styledDoc = new DefaultStyledDocument();   
                    InputStream is = new FileInputStream(file);   
                    new RTFEditorKit().read(is, styledDoc, 0);   
                    result = new String(styledDoc.getText(0,styledDoc.getLength()).getBytes("ISO8859_1"));   
                    //提取文本,读取中文需要使用ISO8859_1编码,否则会出现乱码   
                } catch (IOException e) {   
                    e.printStackTrace();   
                } catch (BadLocationException e) {   
                    e.printStackTrace();   
                }     
            System.out.println("------");
            System.out.println(result);
            System.out.println("------");
            }    
    } JAVA代码改成上面的样子了,编译没有报错,运行的时候就出错了
      

  6.   

    #
    # An unexpected error has been detected by Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d880505, pid=1020, tid=2600
    #
    # Java VM: Java HotSpot(TM) Client VM (1.6.0_02-b06 mixed mode, sharing)
    # Problematic frame:
    # V  [jvm.dll+0xc0505]
    #
    # If you would like to submit a bug report, please visit:
    #   http://java.sun.com/webapps/bugreport/crash.jsp
    #
    运行后显示的结果
      

  7.   


    调用一个方法需要两个步骤:获取方法句柄和调用方法。 
    jmethodID methodID = env-&gt;GetMethodID( JavaClass, "setTest","(I)V"); 
    if(methodID!=0)//获取方法成功 

    env->CallVoidMethod( obj, methodID,12); 
     } 
    GetStaticMethodID是用来获取静态方法的定义,GetMethodID则是获取非静态的方法定义。他们传入参数的参数依次为:类定义、方法名称和方法的定义,方法的定义可以用jdk中带的javap工具反编译class文件获取,其格式如下: 
     public void setTest(int inTest); 
    Signature: (I)V 
    Signature后面的内容就是方法的定义。 
    CallVoidMethod是对获取的方法进行调用,JNI接口中提供了一系列的同类方法,包括静态方法的调用函数(如:CallStaticXXXMethod)和非静态的方法(如:CallXXXMethod),其中XXX表示的不同方法返回类型,包括int、object等等。