Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: JNI types and usage newbie



well, I don't have NSArray example
but I do have NSDictionary example

here is a some code from my WebKitSample


- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation modifierFlags:(unsigned int)modifierFlags
{
if(elementInformation == NULL) return;

//NSString *altImageString = [elementInformation objectForKey : WebElementImageAltStringKey];//Panther
NSString *altImageString = NULL;
NSValue *rectValueNumber = [elementInformation objectForKey : WebElementImageRectKey];
NSRect rectValue = {0,0,0,0};
if(rectValueNumber != NULL){
[rectValueNumber getValue : &rectValue];
}
NSURL *imageURL = [elementInformation objectForKey : WebElementImageURLKey];
NSNumber *selectNumber = [elementInformation objectForKey : WebElementIsSelectedKey];
NSURL *linkURL = [elementInformation objectForKey : WebElementLinkURLKey];
NSString *linkTitleString = [elementInformation objectForKey : WebElementLinkTitleKey];
NSString *linkLabelString = [elementInformation objectForKey : WebElementLinkLabelKey];

if(javaOwner != NULL && [self JVM] != NULL){
bool wasAttached = false;
JNIEnv *env = GetJEnv([self JVM],wasAttached);
if(env == NULL) return;
jclass clazz = env->FindClass(JRISigClass("org/dm/webkit/ DMWebKitView$WebKitElementInfo"));
if(clazz == NULL){
if(wasAttached) [self JVM]->DetachCurrentThread();
return;
}
jclass ownerClazz = env->GetObjectClass(javaOwner);
if(ownerClazz == NULL){
if(wasAttached) [self JVM]->DetachCurrentThread();
return;
}
jmethodID mID = env- >GetMethodID(ownerClazz,"mouseDidMoveOverElement",JRISigMethod(JRISigCla ss("org/dm/webkit/DMWebKitView$WebKitElementInfo")) JRISigVoid);
if(mID == NULL){
if(wasAttached) [self JVM]->DetachCurrentThread();
return;
}
jmethodID cID = env->GetMethodID(clazz,"<init>",JRISigMethod() JRISigVoid);
if(cID == NULL){
if(wasAttached) [self JVM]->DetachCurrentThread();
return;
}
jobject webKitElement = env->NewObject(clazz,cID);
if(webKitElement == NULL){
if(wasAttached) [self JVM]->DetachCurrentThread();
return;
}

setObjectStringField(env,webKitElement,clazz,"imageAltString",altImageSt ring);
setObjectStringField(env,webKitElement,clazz,"imageURLString",[imageURL description]);
setObjectStringField(env,webKitElement,clazz,"linkURLString",[linkURL description]);
setObjectStringField(env,webKitElement,clazz,"linkTitle",linkTitleString );
setObjectStringField(env,webKitElement,clazz,"linkLabel",linkLabelString );
setObjectIntField(env,webKitElement,clazz,"modifyer",(jint)modifierFlags );
jboolean val = JNI_FALSE;
if(selectNumber != NULL){
val = ([selectNumber intValue] == 0)?JNI_FALSE:JNI_TRUE;
}
setObjectBooleanField(env,webKitElement,clazz,"elementSelected",val);
setObjectRectField(env,webKitElement,clazz,"imageRect",rectValue);

env->CallVoidMethod(javaOwner,mID,webKitElement);

env->DeleteLocalRef(webKitElement);
if(wasAttached) [self JVM]->DetachCurrentThread();
}
}

for your information:

void setObjectStringField(JNIEnv *env,jobject object,jclass clazz,const char *methodName,NSString *value){
if(env == NULL || clazz == NULL || methodName == NULL) return;
jstring jstr1 = (value == NULL)?NULL:env->NewStringUTF([value UTF8String]);
jfieldID fID = env->GetFieldID(clazz,methodName,JRISigClass("java/lang/String"));
if(fID != 0) env->SetObjectField(object,fID,jstr1);
}

void setObjectBooleanField(JNIEnv *env,jobject object,jclass clazz,const char *methodName,jboolean value){
if(env == NULL || clazz == NULL || methodName == NULL) return;
jfieldID fID = env->GetFieldID(clazz,methodName,JRISigBoolean);
if(fID != 0) env->SetBooleanField(object,fID,value);
}

void setObjectIntField(JNIEnv *env,jobject object,jclass clazz,const char *methodName,jint value){
if(env == NULL || clazz == NULL || methodName == NULL) return;
jfieldID fID = env->GetFieldID(clazz,methodName,JRISigInt);
if(fID != 0) env->SetIntField(object,fID,value);
}

void setObjectRectField(JNIEnv *env,jobject object,jclass clazz,const char *methodName,NSRect rect){
if(env == NULL || clazz == NULL || methodName == NULL) return;
jfieldID fID = env->GetFieldID(clazz,methodName,JRISigClass("java/awt/Rectangle"));
if(fID == 0) return;
NSPoint point = rect.origin;
NSSize size = rect.size;
jint x = (jint)point.x;
jint y = (jint)point.y;
jint w = (jint)size.width;
jint h = (jint)size.height;
jclass rectClazz = env->FindClass(JRISigClass("java/awt/Rectangle"));
if(rectClazz == NULL) return;
jmethodID cID = env->GetMethodID(rectClazz,"<init>",JRISigMethod(JRISigInt JRISigInt JRISigInt JRISigInt) JRISigVoid);
if(cID == NULL) return;
jobject jrect = env->NewObject(rectClazz,cID,x,y,w,h);
if(jrect == NULL) return;
env->SetObjectField(object,fID,jrect);
}


JNIEnv *GetJEnv(JavaVM *vm,bool &wasAttached){
JNIEnv *env = NULL;
if(vm == NULL) return env;
wasAttached = false;

jint errGetEnv = vm->GetEnv((void **)&env, JNI_VERSION_1_4);
if(errGetEnv == JNI_ERR) return NULL;
if(errGetEnv == JNI_EDETACHED){
vm->AttachCurrentThread((void **)&env,(void *)NULL);
if(env != NULL) wasAttached = true;
}else if(errGetEnv != JNI_OK) return NULL;
return env;
}


#define JRISigArray(T) "[" T
#define JRISigByte "B"
#define JRISigChar "C"
#define JRISigClass(name) "L" name ";"
#define JRISigFloat "F"
#define JRISigDouble "D"
#define JRISigMethod(args) "(" args ")"
#define JRISigNoArgs ""
#define JRISigInt "I"
#define JRISigLong "J"
#define JRISigShort "S"
#define JRISigVoid "V"
#define JRISigBoolean "Z"



Java side
public abstract class DMWebKitView extends CocoaComponent{
......

//callback
public void mouseDidMoveOverElement(WebKitElementInfo elementInfo){
// System.out.println("Java mouseDidMoveOverElement imageAltString "+elementInfo.imageAltString);
// System.out.println("Java mouseDidMoveOverElement imageURLString "+elementInfo.imageURLString);
// System.out.println("Java mouseDidMoveOverElement linkURLString "+elementInfo.linkURLString);
// System.out.println("Java mouseDidMoveOverElement linkTitle "+elementInfo.linkTitle);
// System.out.println("Java mouseDidMoveOverElement modifyer "+elementInfo.modifyer);
// System.out.println("Java mouseDidMoveOverElement elementSelected "+elementInfo.elementSelected);
// System.out.println("Java mouseDidMoveOverElement imageRect "+elementInfo.imageRect);
}

public static class WebKitElementInfo{
String imageAltString;
java.awt.Rectangle imageRect;
String imageURLString;
boolean elementSelected;
String linkURLString;
String linkTitle;
String linkLabel;
int modifyer;
}
}


On Apr 29, 2004, at 8:42 PM, Ken Hawkins wrote:

can anyone point me toward a good sight that describes JNi types and how to use them, in particular jobject. for example...

i have an NSArray coming back from a native cocoa call and i am not sure how i would cast that( er copy that) into a jobject. or is it a jobjectArray? as well how to get items out of it once it is in a relating jobject / jobjectArray...

any help would be greatly appreciated..

thanks,
ken;
_______________________________________________
java-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/java-dev
Do not post admin requests to the list. They will be ignored.


Dmitry Markman
_______________________________________________
java-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/java-dev
Do not post admin requests to the list. They will be ignored.


References: 
 >JNI types and usage newbie (From: Ken Hawkins <email@hidden>)



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.