私はJavaネイティブインターフェースを使用するのが初めてです。私の仕事は、vc++ メソッドを実装することです。
ジャバ。Javaで実装する必要があるメソッドは、vc ++内のdllメソッドを使用します
方法。私の質問は、Java でネイティブ メソッドを宣言し、
ネイティブに宣言されたメソッド、またはコードを C++ から Java に書き直す必要がありますか?
jni。誰かがこれを行う方法について私に提案できますか、私は記事を読みましたが、完全ではありませんでした
jniが何をしているかを理解してください。これは、Java で実装する必要があるメソッドです。
内部的に呼び出されるメソッドは m_hSecdll からのものなので、これらのメソッドをどのように使用すればよいですか?
この getauthorization メソッドを実装する Java
bool HtmlWindow::GetAuthorizationHeader(CString &sName, CString &sValue)
{
//type enum
SecStatus stat;
//typedef for long typw
SecContextHandle hCurrentCtx;
//typedef for struct
SecBufferHandle hBuf = NULL;
try
{
if (!m_hSecdll)
{
m_hSecRtl = AfxLoadLibrary(_T("secdll"));
}
if (!m_hSecdll)
{
AfxMessageBox(IDS_ERR_SECDLL);
return false;
}
//get the function to call SecGetContext
typedef SecStatus (_stdcall *FN2)(SecContextHandle*);
FN2 pFN2 = (FN2) ::GetProcAddress(m_hSecRtl, _T("SecGetContext"));
if (!pFN2)
{
AfxMessageBox(IDS_ERR_SECRTL_SECGETCONTEXT);
return false;
}
//call it
stat = (*pFN2)(&hCurrentCtx);
if (stat != eSecOk) {
AfxMessageBox(IDS_ERR_MPAGES_SERVICE_CONTEXT);
return false;
}
//get the function to call SecExportContext
typedef SecStatus (_stdcall *FN3)(SecBufferHandle*, const SecContextHandle, const char*, const uint);
FN3 pFN3 = (FN3) ::GetProcAddress(m_hSecRtl, _T("SecExportContext"));
if (!pFN3)
{
AfxMessageBox(IDS_ERR_SECRTL_SECEXPORTCONTEXT);
return false;
}
//call it
stat = (*pFN3)(&hBuf, hCurrentCtx, NULL, 0);
if (stat != eSecOk) {
AfxMessageBox(IDS_ERR_MPAGES_SERVICE_EXPORT);
return false;
}
//get the function to call SecExportContext
typedef void* (_stdcall *FN4)(SecBufferHandle);
FN4 pFN4 = (FN4) ::GetProcAddress(m_hSecRtl, _T("SecGetBufferPtr"));
if (!pFN4)
{
AfxMessageBox(IDS_ERR_SECRTL_SECGETBUFFERPTR);
return false;
}
//call it
unsigned char * c = (unsigned char*)(*pFN4)(hBuf);
//get the function to call SecExportContext
typedef long (_stdcall *FN5)(SecBufferHandle);
FN5 pFN5 = (FN5) ::GetProcAddress(m_hSecRtl, _T("SecGetBufferLen"));
if (!pFN5)
{
AfxMessageBox(IDS_ERR_SECRTL_SECGETBUFFERLEN);
return false;
}
//call it
int length = (*pFN5)(hBuf);
int x = 0;
char * hex = new char[length*2];
for (int i = 0; i < length; i++)
{
CString sTemp;
sTemp.Format("%x",c[i]);
if (sTemp.GetLength()==1)
sTemp = _TCHAR('0') + sTemp;
hex[x++] = sTemp[0];
hex[x++] = sTemp[1];
}
sName = "Some String";
sValue = CString(hex,length*2);
delete [] hex;
}
catch (...)
{
AfxMessageBox(IDS_ERR_SECDLL_UNKNOWN);
return false;
}
return true;
}