#include <jni.h>
//#include "JCom.h"
// V^CvJNI(jdk1.2ȍ~)
//#include "jp_0005cne_0005cso_0005fnet_0005cga2_0005cno_0005fji_0005cjcom_0005cJCom.h"
// Â^CvJNI(ȂƂjdk1.2O)
#include "jp_ne_so_0005fnet_ga2_no_0005fji_jcom_IUnknown.h"
#include "atlbase.h"
#include "atlconv.h"
#include "JCom.h"
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_IUnknown
* Method: _queryInterface
* Signature: (Ljp/ne/so_net/ga2/no_ji/jcom/GUID;)I
* **********************************************************************/
JNIEXPORT jint JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_IUnknown__1queryInterface
(JNIEnv *env, jobject obj, jobject guid)
{
// IUnknownC^[tF[X̃|C^oB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
IUnknown* pIUnknown = (IUnknown*)env->GetIntField(obj, fieldID);
// IID擾
GUID IID;
jobject2GUID(env, guid, &IID);
// IUnknown::QueryInterfaceĂԁB
void* pObject = NULL;
HRESULT hr = pIUnknown->QueryInterface(IID, &pObject);
if(hr==E_NOINTERFACE) { // 0x80004002L
return (jint)0; // no interface
}
if(FAILED(hr)) {
// O𓊂
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
char message[256];
sprintf(message, "IUnknown.queryInterface() failed HRESULT=0x%XL",hr);
env->ThrowNew(clsJComException, message);
return 0;
}
// IUnknownC^[tF[X̃|C^ԂB
return (jint)(int)pObject; // I
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_IUnknown
* Method: _release
* Signature: ()Z
* **********************************************************************/
JNIEXPORT jboolean JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_IUnknown__1release
(JNIEnv *env, jobject obj)
{
// IUnknownC^[tF[X̃|C^oB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
IUnknown* pIUnknown = (IUnknown*)env->GetIntField(obj, fieldID);
// łNULLȂKv͂ȂB
if(pIUnknown==NULL) {
return JNI_FALSE; // łɉς
}
//
pIUnknown->Release();
// pIUnknownOɂB
// env->SetIntField(obj, fieldID, (jint)0);
return JNI_TRUE; //
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_IUnknown
* Method: _addRef
* Signature: ()I
* **********************************************************************/
JNIEXPORT jint JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_IUnknown__1addRef
(JNIEnv *env, jobject obj)
{
// IUnknownC^[tF[X̃|C^oB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
IUnknown* pIUnknown = (IUnknown*)env->GetIntField(obj, fieldID);
ULONG count = pIUnknown->AddRef();
return (jint)count;
}
/* **********************************************************************
* Class: jp_ne_so_0005fnet_ga2_no_0005fji_jcom_IUnknown
* Method: _getProgIDFromCLSID
* Signature: (Ljp/ne/so_net/ga2/no_ji/jcom/GUID;)Ljava/lang/String;
* **********************************************************************/
JNIEXPORT jstring JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_IUnknown__1getProgIDFromCLSID
(JNIEnv *env, jclass cls, jobject iid)
{
// CLSID擾
GUID IID;
jobject2GUID(env, iid, &IID);
// CLSIDProgID擾
BSTR bstrProgID = NULL;
HRESULT hr = ProgIDFromCLSID(IID, &bstrProgID);
if(FAILED(hr)) {
printf("hr=%Xh \n", hr);
return (jstring)NULL;
}
// BSTRjstringɕϊ
jstring jProgID = BSTR2jstring(env, bstrProgID);
SysFreeString(bstrProgID);
return jProgID;
}
/*
JNIEXPORT jobject JNICALL Java_jp_ne_so_1net_ga2_no_1ji_jcom_IUnknown_queryInterface
(JNIEnv *env, jobject obj, jobject guid)
{
// IUnknownC^[tF[X̃|C^oB
jclass cls = env->GetObjectClass(obj);
jfieldID fieldID = env->GetFieldID(cls, "pIUnknown", "I");
IUnknown* pIUnknown = (IUnknown*)env->GetIntField(obj, fieldID);
GUID IID;
jobject2GUID(env, guid, &IID);
void* pObject = NULL;
HRESULT hr = pIUnknown->QueryInterface(IID, &pObject);
if(FAILED(hr)) {
// O𓊂
jclass clsJComException = env->FindClass(CLASS_JCOM_EXCEPTION);
char message[256];
sprintf(message, "IUnknown.queryInterface() failed HRESULT=0x%XL",hr);
env->ThrowNew(clsJComException, message);
return NULL;
}
// IUnknown(JComManager)ĂԁB̍ۂɁAJComManager jcmn
jclass clsIUnknown = env->FindClass(CLASS_IUNKNOWN);
jmethodID method = env->GetMethodID(clsIUnknown, "<init>", "(Ljp/ne/so_net/ga2/no_ji/jcom/JComManager;)V");
jfieldID jcmID = env->GetFieldID(clsIUnknown, "jcm", "Ljp/ne/so_net/ga2/no_ji/jcom/JComManager;");
jobject jcm = env->GetObjectField(obj, jcmID);
jobject result = env->NewObject(clsIUnknown, method, jcm);
// ꂽIuWFNg_pIUnknowntB[h var->punkVal ZbgB
jfieldID field_pIUnknown = env->GetFieldID(clsIUnknown, "pIUnknown", "I");
env->SetIntField(jcm, field_pIUnknown, (jint)(int)pObject);
return result; // I
}
*/