public class RegistryKey {
1. Java Interface
static {
System.loadLibrary( "regAccess" );
}
public static native RegistryKey createHKEY_CLASSES_ROOT( );
public static native RegistryKey createHKEY_CURRENT_USER( );
public static native RegistryKey createHKEY_LOCAL_MACHINE( );
public static native RegistryKey createHKEY_USERS( );
public native void open( int parentHandle );
public native void close( );
public native void retrieveInfo( );
public native RegistryKey retrieveSubKeyFromRegistry( int index );
public native RegistryValue retrieveValueFromRegistry( int index );
}
2. C++ Interface
/*
* Class: RegistryKey
* Method: createHKEY_CLASSES_ROOT
* Signature: ()LRegistryKey;
*/
JNIEXPORT jobject JNICALL Java_RegistryKey_createHKEY_1CLASSES_1ROOT
(JNIEnv *, jclass);
/*
* Class: RegistryKey
* Method: open
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_RegistryKey_open
(JNIEnv *, jobject, jint);
3. C++ Implementation
JNIEXPORT jobject JNICALL Java_RegistryKey_createHKEY_1CLASSES_1ROOT
(JNIEnv *env, jclass cls ) {
jfieldID fid = 0;
jmethodID mid = 0;
jobject obj;
// ...
// Öffnen des RegistryKeys HKEY_CLASSES_ROOT
// ...
mid = env->GetMethodID(
cls,
"<init>",
"(Ljava/lang/String;Ljava/lang/String;I)V" );
if ( mid != 0 ) {
obj = env->NewObject(
cls,
mid,
env->NewStringUTF( name ),
env->NewStringUTF( className ),
( jint )HKEY_CLASSES_ROOT );
mid = env->GetMethodID( cls, "setOpened", "(Z)V" );
env->CallVoidMethod( obj, mid, ( jboolean )true );
return obj;
} else
return NULL;
}
JNIEXPORT void JNICALL Java_RegistryKey_open
(JNIEnv *env, jobject obj, jint parentHandle ) {
jclass cls;
jfieldID fid;
jstring jstr;
const char* str;
HKEY resultHandle;
cls = env->GetObjectClass( obj );
if ( parentHandle != 0 ) {
fid = env->GetFieldID( cls, "name", "Ljava/lang/String;" );
jstr = ( jstring )( env->GetObjectField( obj, fid ) );
str = env->GetStringUTFChars( jstr, 0 );
// ...
// Öffnen des aktuellen RegistryKeys
// ...
fid = env->GetFieldID( cls, "handle", "I" );
env->SetIntField( obj, fid, ( jint )resultHandle );
fid = env->GetFieldID( cls, "opened", "Z" );
env->SetBooleanField( obj, fid, ( jboolean )true );
}
}
JNIEXPORT jobject JNICALL Java_RegistryKey_retrieveValueFromRegistry
(JNIEnv *env, jobject obj, jint index ) {
jclass cls1, cls2;
jfieldID fid = 0;
jmethodID mid = 0;
jbyteArray jba;
jbyte* jbabytes;
long handle;
cls1 = env->GetObjectClass( obj );
fid = env->GetFieldID( cls1, "handle", "I" );
handle = ( long )( env->GetIntField( obj, fid ) );
// ...
// Abfragen des index-ten Values
// ...
cls2 = env->FindClass( "RegistryValue" );
mid = env->GetMethodID(
cls2,
"<init>",
"(Ljava/lang/String;I[B)V" );
if ( mid != 0 ) {
jba = env->NewByteArray( dataLength );
jbabytes = env->GetByteArrayElements( jba, 0 );
for ( unsigned int idx = 0; idx < dataLength; idx++ )
jbabytes[ idx ] = data[ idx ];
env->ReleaseByteArrayElements( jba, jbabytes, 0 );
return env->NewObject(
cls2,
mid,
env->NewStringUTF( name ),
( jint )type,
jba );
} else
return NULL;
}
|