2013-02-05 5 views
2

J'avais besoin d'une application Java pour appeler C++ non géré. J'ai copié MSVCR90.dll manuellement à partir du chemin Redist de Visual Studio 2008 vers le Windows Server Datacenter de vmware.Appel de C++ non géré via Java

C'est l'erreur que je reçois:

Une erreur fatale a été détectée par le Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x73b4ae7a, pid=1108, tid=2272 

JRE version: 6.0_38-b05 
Java VM: Java HotSpot(TM) Client VM (20.13-b02 mixed mode, sharing windows-x86) 
Problematic frame: 
C [MSVCR90.dll+0x3ae7a] 

An error report file with more information is saved as: 
...\hs_err_pid1108.log 

If you would like to submit a bug report, please visit: 
http://java.sun.com/webapps/bugreport/crash.jsp 
The crash happened outside the Java Virtual Machine in native code. 
See problematic frame for where to report the bug. 

Voici le code C++:

#include "stdafx.h" 

#include <stdio.h> 

#include "CCCheckString.h" 

#include <vector> 

#include <String> 

using namespace std; 
#include "jobHandler.h" 

JNIEXPORT jbolean JNICALL Java_CCCheckString_Login 
    (JNIEnv *env, jobject object, jstring host, jstring UserName, jstring Domain, jstring Password) 
{ 
    bool result; 

    jobHandler *handler = new jobHandler(); 

    const char *hostStr = (env)->GetStringUTFChars(host, NULL); 
    string hostS(hostStr); 
    const char *UserNameStr = (env)->GetStringUTFChars(UserName, NULL); 
    string UserNameS(UserNameStr); 
    const char *DomainStr = (env)->GetStringUTFChars(Domain, NULL); 
    string DomainS(DomainStr); 
    const char *PasswordStr = (env)->GetStringUTFChars(Password, NULL); 
    string PasswordS(PasswordStr); 

     //if comment this line everthing is okey 
    **result = handler->Login(hostS,UserNameS,DomainS,PasswordS);** 

    (env)->ReleaseStringUTFChars(host, NULL); 
    (env)->ReleaseStringUTFChars(UserName, NULL); 
    (env)->ReleaseStringUTFChars(Domain, NULL); 
    (env)->ReleaseStringUTFChars(Password, NULL); 


    delete handler; 

    return result; 

} 

Voici le code de traitement en Java:

CCCheckString ccCheckString = new CCCheckString(); 

result=ccCheckString.Login("xxx", "xxx", "xx", "xxx"); 

Comment réparer l'erreur?

+1

améliorer la lisibilité –

+0

@ACB est que okey – edelibas

+0

ajouter 4 espaces avant toute pièce de code. Regardez 'Mon code de traitement est ci-dessous. (C++)' –

Répondre

1

J'ai résolu.

Le problème est que Connexion() accepte std :: string, mais nous ne pouvons pas envoyer

Nous réorganisons notre login() et il doit prendre const char []

Ex:

bool ClassName::Login(std::string host,std::string userName,std::string userDomain,std::string userPassword) 
{ //Orginal Code Here ....} 

bool ClassName::Login(const char host[],const char userName[],const char userDomain[],const char userPassword[]) 
{ 
std::string strHost(host); 
std::string strUserName(userName); 
std::string strUserDomain(userDomain); 
std::string strUserPassword(userPassword); 
return Login(strHost,strUserName,strUserDomain,strUserPassword); 

} 

Tout va bien.

Questions connexes