|
From: Arno P. <ar...@pu...> - 2011-08-03 16:07:55
|
I suggest you write yourself a little shell script based on the
instructions I mentioned in my last message.
Arno
On 8/3/11 9:01 AM, Shai wrote:
> Thanks Arno that explains allot.
> How do I add this to the build process at least for now (until there is
> a more official plugin architecture)?
> Do I just place the file in the native directory and recompile xmlvm?
> Do I need to list it somewhere in the build process?
>
> Thanks,
> Shai.
>
> ------------------------------------------------------------------------
> *From:* Arno Puder <ar...@pu...>
> *To:* "Xml...@li..."
> <Xml...@li...>
> *Sent:* Wednesday, August 3, 2011 6:30 PM
> *Subject:* [xmlvm-dev] Native methods in the C backend
>
>
> there was a question on the mailing list regarding the native interface
> for the C backend. While XMLVM already makes extensive use of the native
> interface when cross-compiling Apache Harmony, we have not exposed this
> functionality in a proper way for applications. However, here a little
> how-to showing how this can be done. 'Proper' support would just do a
> better job at integrating the following steps into the XMLVM toolchain,
> but the basic principles would remain the same.
>
> Consider the following class NativeTest. The idea is to provide an
> implementation for nativeMethod() that prints out the array and then
> calls back to a Java method:
>
> package xmlvm;
>
> public class NativeTest {
>
> native void nativeMethod(int[] intArray);
>
> void methodToBeCalledFromNative() {
> System.out.println("Hello from methodToBeCalledFromNative()");
> }
>
> public static void main(String[] args) {
> int intArray[] = {2, 4, 6, 8};
> NativeTest instance = new NativeTest();
> instance.nativeMethod(intArray);
> }
> }
>
> javac NativeTest.java
> xmlvm --in=NativeTest.class --out=out --target=posix
> mv out/src/xmlvm.m out/src/xmlvm.c
> xmlvm --in=NativeTest.class --out=native \
> --target=gen-c-wrappers --gen-native-skeletons
> # Ignore the error that the last command will generate. This command
> # will generate a skeleton file for nativeMethod().
> # In file native/native_xmlvm_NativeTest.c out/src/ inject the following
> code:
>
> //XMLVM_BEGIN_NATIVE[xmlvm_NativeTest_nativeMethod___int_1ARRAY]
> xmlvm_NativeTest* thiz = me;
> printf("Hello from nativeMethod()\n");
> org_xmlvm_runtime_XMLVMArray* intArray = n1;
> JAVA_ARRAY_INT* data = (JAVA_ARRAY_INT*)
> intArray->fields.org_xmlvm_runtime_XMLVMArray.array_;
> int length = intArray->fields.org_xmlvm_runtime_XMLVMArray.length_;
> for (int i = 0; i < length; i++) {
> printf("%d, ", data[i]);
> }
> printf("\n");
> #ifdef XMLVM_VTABLE_IDX_xmlvm_NativeTest_methodToBeCalledFromNative__
> VTABLE_PTR func =
> thiz->tib->vtable[XMLVM_VTABLE_IDX_xmlvm_NativeTest_methodToBeCalledFromNative__];
> (*(void (*)(JAVA_OBJECT)) func)(me);
> #else
> xmlvm_NativeTest_methodToBeCalledFromNative__(me);
> #endif
> //XMLVM_END_NATIVE
>
> cp native/native_xmlvm_NativeTest.c out/src/
> cd out/dist/
> make
> ./build/out
>
> A few comments: the purpose of the special comment markers
> //XMLVM_BEGIN_* and //XMLVM_END_NATIVE is to clearly distinguish between
> generated portions of the file (outside the special markers) and
> injected code (inside the markers). When the skeleton is regenerated via
> --gen-native-skeletons (e.g., because of new added native methods in
> NativeTest), the injected code will be automatically migrated.
>
> Another comment regarding the ominous #ifdef: XMLVM performs various
> optimizations on the generated C code. If a method is never overridden
> in an application, XMLVM will not put it in the vtable of the class. The
> #ifdef will be true iff the method in question was overridden. In this
> case the method needs to be called via the vtable (the funky looking
> function pointer). If the #ifdef is false, it means the method was never
> overridden in the application and can therefore be called directly.
>
> Note that the application does not terminate. That is because the
> garbage collection thread is not yet a daemon thread and therefore
> blocks termination of the application. This will be fixed.
>
> Hope this helps,
> Arno
>
> ------------------------------------------------------------------------------
> BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA
> The must-attend event for mobile developers. Connect with experts.
> Get tools for creating Super Apps. See the latest technologies.
> Sessions, hands-on labs, demos & much more. Register early & save!
> http://p.sf.net/sfu/rim-blackberry-1
> _______________________________________________
> Xmlvm-developers mailing list
> Xml...@li...
> <mailto:Xml...@li...>
> https://lists.sourceforge.net/lists/listinfo/xmlvm-developers
>
>
>
>
> ------------------------------------------------------------------------------
> BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA
> The must-attend event for mobile developers. Connect with experts.
> Get tools for creating Super Apps. See the latest technologies.
> Sessions, hands-on labs, demos& much more. Register early& save!
> http://p.sf.net/sfu/rim-blackberry-1
>
>
>
> _______________________________________________
> Xmlvm-developers mailing list
> Xml...@li...
> https://lists.sourceforge.net/lists/listinfo/xmlvm-developers
|