我是使用 java 本机接口的新手。我的任务是在
爪哇。我需要在 java 中实现的方法使用 vc++ 中的 dll 方法
方法。我的问题是,在 java 中声明本机方法并调用
本机声明的方法还是我仍然需要将代码从 c++ 重写为 java 使用
杰尼 任何人都可以建议我如何做到这一点,我阅读了文章但没有完全
了解 jni 在做什么。这是我必须在java中实现的方法,
内部调用的方法来自 m_hSecdll,所以我应该如何使用这些方法
java实现这个getauthorization方法
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;
}