Мы просто кодируем служебные методы для каждого из типов исключений, которые мы хотим выдать. Вот некоторые примеры:
jint throwNoClassDefError( JNIEnv *env, char *message )
{
jclass exClass;
char *className = "java/lang/NoClassDefFoundError";
exClass = (*env)->FindClass( env, className);
if (exClass == NULL) {
return throwNoClassDefError( env, className );
}
return (*env)->ThrowNew( env, exClass, message );
}
jint throwNoSuchMethodError(
JNIEnv *env, char *className, char *methodName, char *signature )
{
jclass exClass;
char *exClassName = "java/lang/NoSuchMethodError" ;
LPTSTR msgBuf;
jint retCode;
size_t nMallocSize;
exClass = (*env)->FindClass( env, exClassName );
if ( exClass == NULL ) {
return throwNoClassDefError( env, exClassName );
}
nMallocSize = strlen(className)
+ strlen(methodName)
+ strlen(signature) + 8;
msgBuf = malloc( nMallocSize );
if ( msgBuf == NULL ) {
return throwOutOfMemoryError
( env, "throwNoSuchMethodError: allocating msgBuf" );
}
memset( msgBuf, 0, nMallocSize );
strcpy( msgBuf, className );
strcat( msgBuf, "." );
strcat( msgBuf, methodName );
strcat( msgBuf, "." );
strcat( msgBuf, signature );
retCode = (*env)->ThrowNew( env, exClass, msgBuf );
free ( msgBuf );
return retCode;
}
jint throwNoSuchFieldError( JNIEnv *env, char *message )
{
jclass exClass;
char *className = "java/lang/NoSuchFieldError" ;
exClass = (*env)->FindClass( env, className );
if ( exClass == NULL ) {
return throwNoClassDefError( env, className );
}
return (*env)->ThrowNew( env, exClass, message );
}
jint throwOutOfMemoryError( JNIEnv *env, char *message )
{
jclass exClass;
char *className = "java/lang/OutOfMemoryError" ;
exClass = (*env)->FindClass( env, className );
if ( exClass == NULL ) {
return throwNoClassDefError( env, className );
}
return (*env)->ThrowNew( env, exClass, message );
}
Тот путь, легко найти их, Ваш редактор завершения кода поможет Вам ввести их, и можно передать простые параметры.
я уверен, что Вы могли развернуть это для обрабатывания объединенных в цепочку исключений или других более сложных подходов. Этого было достаточно для удовлетворения наших потребностей.
First attempt
Not sure if this helps a lot, but here's an article on Ajax + FBML: http://wiki.developers.facebook.com/index.php/FBJS#Creating_FBML_Elements
В частности, возможно, вы можете использовать метод setInnerFBML ()
Follow up
Итак, я думаю, что инициализация функция анализирует файл fbml. Итак, очевидный вопрос: как заставить библиотеку javascript facebook повторно анализировать fbml (или просто анализировать новый fbml), если вы вставляете fbml после инициализации.
Похоже, эта ветка может помочь: http://forum.developers.facebook.com/viewtopic.php?id=22245
Here's what appears to be the relevant code although there is more context at the forum:
if ( FB.XFBML.Host.parseDomTree )
setTimeout( FB.XFBML.Host.parseDomTree, 0 );
FB.XFBML.Host.parseDomTree у меня не работал. Возможно, это изменилось в новом api. Что сработало, так это:
FB.XFBML.parse(document.getElementById('foo'))
или
FB.XFBML.parse()
если вы хотите разобрать всю страницу.