2017-08-28 9 views
1

このC++/CLIコードは/ clrでコンパイルされています。 JNIとJavaからC++/CLIでマネージC#を公開する

exportedCall() 

を呼び出すことができる

// CppBridge.cpp : Defines the entry point for the console application. 


#include "stdafx.h" 
#using <mscorlib.dll> 


using namespace System; 
using namespace EmulatorLibrary; 

using namespace std; 

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport) 

EXTERN_DLL_EXPORT const char* exportedCall() 
{ 

    return "exportedCall"; 
} 


public ref class DelegateCLI 
{ 
    private: 

    EmulatorDelegate^ emulatorDelegate; 

    public: 

    DelegateCLI() { 

    emulatorDelegate = gcnew EmulatorDelegate(); 
    } 

    String^ callTest() { 

    return emulatorDelegate->test(); 

    } 

}; 

。私はこの時点でJavaに問題はありません。

しかし今、私はcallTest()に電話する必要があります。このアプローチはまだC++/CLIです。ではない ?私はgcrootへの参照を見てきましたが、これを実現する手順を完全に理解していませんでした。

このC++/CLIレイヤでcallTest()をエクスポートするにはどうすればよいですか?

更新1:https://msdn.microsoft.com/en-us/library/c320cx3h.aspxが見つかりました。私はそれを解読しようとしています。

これは動作するはずです。

extern "C" { 
__declspec(dllexport) 
    String^ exportedCall1() { 
    EmulatorDelegate^ emulatorDelegate = gcnew EmulatorDelegate(); 
    return emulatorDelegate->test(); 

} 
} 

アップデート2:https://msdn.microsoft.com/en-us/library/481fa11f(v=vs.80).aspxは、私が模索していますものです。しかし、私は、管理された関数によって返されたStringを返す関数をエクスポートする必要があります。

これは私のための最善の試みです。 DLLにコンパイルします。うまくいくはずです。右 ?テストする必要があります。

class Unmanaged { 
public: 
    gcroot<String^> interopstring; 
    Unmanaged() {} 
}; 

EXTERN_DLL_EXPORT const char* exportedInteropCall() 
{ 

EmulatorDelegate^ emulatorDelegate = gcnew EmulatorDelegate(); 
Unmanaged u; 
u.interopstring = emulatorDelegate->test(); 
return (const char*) 
(Marshal::StringToHGlobalAnsi(u.interopstring)).ToPointer(); // "exportedCall"; 
} 
+0

ありcallTest()はC++/CLI経由です。 Javaが直接それを呼び出すことができるかどうかは別の話です。 C++/CLIのポイントは、管理されていない言語から呼び出すことができるということです。 – MickyD

+0

多くの調査といくつかの作業コードの後に​​なぜ投票されたのか不明です。 JavaはJNAを使用してexportedCall()を正常に呼び出します。 –

+0

私ではありませんでした。ここで+1をする。 :) – MickyD

答えて

0

このコードは私が後にしたものです。 .exeをデバッグモードで実行してテストしました。 C++/CLIレイヤーからC#コードを呼び出すことができます。

class Unmanaged { 
public: 
gcroot<String^> interopstring; 
Unmanaged() {} 
}; 

EXTERN_DLL_EXPORT const char* exportedInteropCall() 
{ 
    EmulatorDelegate^ emulatorDelegate = gcnew EmulatorDelegate(); 
    Unmanaged u; 
    u.interopstring = emulatorDelegate->test(); 
    return (const char*) 
    (Marshal::StringToHGlobalAnsi(u.interopstring)).ToPointer(); // "exportedCall"; 
} 
関連する問題