I think the issue is that Lingua::StanfordCoreNLP has the java code in the __DATA__ section of the PM fileDoesn't seem to be an issue with Inline::C - though, faik, that might be quite irrelevant wrt Inline::Java.
With a site/lib/FOO/Soldier.pm that contains:
package FOO::Soldier;
use warnings;
use strict;
use Inline 'C';
1;
__DATA__
__C__
typedef struct {
char* name;
char* rank;
long serial;
} Soldier;
SV* new(char* class, char* name, char* rank, long serial) {
Soldier* soldier;
SV* obj_ref = newSViv(0);
SV* obj = newSVrv(obj_ref, class);
New(42, soldier, 1, Soldier);
soldier->name = savepv(name);
soldier->rank = savepv(rank);
soldier->serial = serial;
sv_setiv(obj, (IV)soldier);
SvREADONLY_on(obj);
return obj_ref;
}
char* get_name(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->name;
}
char* get_rank(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->rank;
}
long get_serial(SV* obj) {
return ((Soldier*)SvIV(SvRV(obj)))->serial;
}
void DESTROY(SV* obj) {
printf("Destroy called\n");
Soldier* soldier = (Soldier*)SvIV(SvRV(obj));
Safefree(soldier->name);
Safefree(soldier->rank);
Safefree(soldier);
}
I can run the following script without any trouble:
package MyPackage;
use warnings;
use strict;
use FOO::Soldier;
my $obj1 = FOO::Soldier->new('Benjamin', 'Private', 11111);
my $obj2 = FOO::Soldier->new('Sanders', 'Colonel', 22222);
my $obj3 = FOO::Soldier->new('Matt', 'Sergeant', 33333);
for my $obj ($obj1, $obj2, $obj3) {
print $obj->get_serial, ") ",
$obj->get_name, " is a ",
$obj->get_rank, "\n";
}
which outputs (as expected):
11111) Benjamin is a Private
22222) Sanders is a Colonel
33333) Matt is a Sergeant
Destroy called
Destroy called
Destroy called
Good luck with it!
Cheers,
Rob