0

だから、私は.dllファイルにコンパイルするビジュアルスタジオconsloeプロジェクトを持っています。シンプルなウィンドウフォームを作成しましたSystem::Windows::Forms::Form

.java ファイルを作成しました。

 import java.io.Serializable;


public class MyBean implements Serializable{

    /**
     * 
     */
    static{
        System.loadLibrary("MyBean");
}
    private static final long serialVersionUID = 1L;


    private static native String getDateCpp();


    public String getDate(){
        return getDateCpp();
    }



}

それをコンパイルし、javah によって .h ファイルを生成します。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyBean */

#ifndef _Included_MyBean
#define _Included_MyBean
#ifdef __cplusplus
extern "C" {
#endif
#undef MyBean_serialVersionUID
#define MyBean_serialVersionUID 1i64
/*
 * Class:     MyBean
 * Method:    getDateCpp
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_MyBean_getDateCpp
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

フォームを示す .cpp ファイルを実装しました。

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include "Form1.h"
#include "MyBean.h"
#include <string>
#include <vcclr.h>
using namespace std;


bool To_string( String^ source, string &target )
{
    pin_ptr<const wchar_t> wch = PtrToStringChars( source );
    int len = (( source->Length+1) * 2);
    char *ch = new char[ len ];
    bool result = wcstombs( ch, wch, len ) != -1;
    target = ch;
    delete ch;
    return result;
}

JNIEXPORT jstring JNICALL Java_MyBean_getDateCpp
    (JNIEnv * env, jclass jcl){
        Form1^ form = gcnew Form1();
        form->Show();

        String^ text = form->text;
        string stdString = "";


        if(To_string(text,stdString))
            return  (*env).NewStringUTF(stdString.c_str());
        else
            return (*env).NewStringUTF("blad");
}

コンパイルに成功した後、c++ 関数を呼び出そうとすると Java からエラーが発生します。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007f9324f811c, pid=4404, tid=4800
#
# JRE version: Java(TM) SE Runtime Environment (7.0_45-b18) (build 1.7.0_45-b18)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [KERNELBASE.dll+0x3811c]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\studia\semestr 7\java\lab05\hs_err_pid4404.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

ログは長いので、ここには投稿しません。

私が間違っているのは何ですか?

4

2 に答える 2

0

私が電話している1つの間違いがありますがform->Show();、私は電話する必要がありますform->ShowDialog();

MSDN から:

ShowDialog()

このメソッドを使用して、アプリケーションでモーダル ダイアログ ボックスを表示できます。このメソッドが呼び出されると、その後のコードは、ダイアログ ボックスが閉じられるまで実行されません。

見せる()

コントロールを表示することは、Visible プロパティを true に設定することと同じです。Show メソッドが呼び出された後、Hide メソッドが呼び出されるまで、Visible プロパティは true の値を返します。

そのため、show を呼び出すと、空の文字列が変換され、ウィンドウが 1 秒以内しか表示されませんでした。現在はモーダルであり、閉じるのを待ってから、残りのコードが実行されます。JNI は適切に実装され、問題なく動作します。

于 2013-11-15T07:46:41.580 に答える