GDNative is c++. Interesting... I had no idea you could use that. It would execute 100x faster than GDScript, in theory. The behavior you're describing would lead me to believe that the Stats aren't initializing before you attempt to use them.
int sword_dmg=2;
A declaration like the above will allocate memory for the variable "sword_dmg" and set the value to "2".
int sword_dmg;
A declaration like the above will allocate memory for the variable "sword_dmg" and it will be set to whatever the value happened to have been before the program claimed that memory as it's own. So... if the prior value for the 2 bytes had hexadecimal values of "4F" and "FA"... well... congrats man, you've got garbage for your sword_dmg. No worries... with that much damage, the sword will kill anything it hits. : P
More to the point, in "Bat::on_Hurtbox_area_entered":
SwordHitbox *swordHitBox = (SwordHitbox*) area;
Can be changed to:
SwordHitbox *swordHitBox = (SwordHitbox*) area;
area->_init();
I think you'll also need to do the same thing with "Stats".
Put "print" lines in all of your "_init" methods to see if they're even running.
I don't know if this'll solve your problem. But it may be a good place to start?