この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";
}
ありcallTest()はC++/CLI経由です。 Javaが直接それを呼び出すことができるかどうかは別の話です。 C++/CLIのポイントは、管理されていない言語から呼び出すことができるということです。 – MickyD
多くの調査といくつかの作業コードの後になぜ投票されたのか不明です。 JavaはJNAを使用してexportedCall()を正常に呼び出します。 –
私ではありませんでした。ここで+1をする。 :) – MickyD