"Error: Unsupported type void, deriving from fundamental void"
The object was dead-simple, and derived from GObject, so I wasn't sure what the problem was. Ultimately, it turned out that that was gjs's way of telling me it didn't have a definition for my constructor. Yikes. Ultimately, I had to specify a 'shared-library' attribute for the 'namespace' element in the .gir and .typelib files that gjs was using for introspection. I wasted a couple hours trying to figure that out. Whee.
For now, I filed a bug, 706906, requesting a useful error message when definitions aren't found, rather than ambiguously complaining about void types.
Writing the Object and test file
First I created a quick object using Vala for my test case.
namespace Foo {
public class Bar : GLib.Object {
public GLib.HashTablehashtable { get; set; }
public Bar () {
this.hashtable = new GLib.HashTable(GLib.str_hash, GLib.str_equal);
}
}
}
Well, that was quick. Next I wrote a small .js file
#!/usr/bin/gjs
const Foo = imports.gi.Foo;
var bar = new Foo.Bar ();
Compiling the Vala object and introspection files
Of ourse, first you'll need to compile your shared library, Foo.
valac --library=foo --gir=Foo-0.1.gir --vapi foo.vapi -H foo.h -g Foo.vala -X -fPIC -X -shared -o libfoo.so
If you try to run test.js now, it won't find the library and will report the error:
"Requiring Foo, version none: Typelib file for namespace 'Foo' (any version) not found"
To access Foo via introspection, we'll of course need to compile the .typelib too!
g-ir-compiler --shared-library=libfoo.so Foo-0.1.gir --output Foo-0.1.typelib
If you don't specify the name of the shared-library, that's when you'll see the earlier error, "Error: Unsupported type void, deriving from fundamental void" when trying to actually use the objects from gjs, as they're defined, they're only declared through their typelib
If you still see the Typelib file not found, it might not be in your GI_TYPELIB_PATH, so you might want to set that. Lots of typelibs get installed to /usr/lib64/girepository-1.0/. For my test case, I set GI_TYPELIB_PATH=. since my typelib is in the current directory.
GHashTable properties: the original problem
Now all I need to do is find a solution to my original problem, "Error: Unable to introspect element-type of container in GValue", where I can't access a GHashTable as a property. :\ (Now bug 706907)
Keine Kommentare:
Kommentar veröffentlichen