Browse Source

name mangling in message corrected

JNI-44
Volker Birk 10 years ago
parent
commit
fede0a1aae
  1. 4
      src/Makefile
  2. 127
      src/gen_cpp_Message.ysl2
  3. 4
      test/Makefile
  4. 8
      test/Testing.java

4
src/Makefile

@ -46,7 +46,7 @@ $(LIBRARY): org_pEp_jniadapter_AbstractEngine.o org_pEp_jniadapter_Engine.o org_
ar -r $@ *.o ar -r $@ *.o
$(SHARED): $(LIBRARY) $(SHARED): $(LIBRARY)
g++ -shared -o $(SHARED) $(LDFLAGS) -lpEpEngine *.o c++ -shared -o $(SHARED) $(LDFLAGS) -lpEpEngine *.o
org/pEp/jniadapter/pEpException.java: pEp.yml2 gen_java_exceptions.ysl2 org/pEp/jniadapter/pEpException.java: pEp.yml2 gen_java_exceptions.ysl2
yml2proc -y gen_java_exceptions.ysl2 $< -o $@ yml2proc -y gen_java_exceptions.ysl2 $< -o $@
@ -73,7 +73,7 @@ basic_api.o: basic_api.cc jniutils.hh throw_pEp_exception.hh
.PHONY: clean .PHONY: clean
clean: clean:
rm -f $(JAR) $(LIBRARY) rm -f $(JAR) $(LIBRARY) $(SHARED)
rm -f *.o rm -f *.o
rm -f *.class rm -f *.class
rm -f *.xml *.xsl rm -f *.xml *.xsl

127
src/gen_cpp_Message.ysl2

@ -9,64 +9,84 @@ tstylesheet {
template "struct" { template "struct" {
const "jname" call "CamelCase" with "text", "@name"; const "jname" call "CamelCase" with "text", "@name";
document("org_pEp_jniadapter_{$jname}.cc", "text") document("org_pEp_jniadapter_{$jname}.cc", "text") {
|| ||
#include <exception> #include <exception>
#include <new> #include <new>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
#include <pEp/«@name».h> #include <pEp/«@name».h>
#include "jniutils.hh" #include "jniutils.hh"
#include "org_pEp_jniadapter_«$jname».h" #include "org_pEp_jniadapter_«$jname».h"
using namespace std; using namespace std;
namespace pEp { namespace pEp {
namespace JNIAdapter { namespace JNIAdapter {
static ::«@name» *«@name»_ptr(JNIEnv *env, jobject me) { static ::«@name» *«@name»_ptr(JNIEnv *env, jobject me) {
jfieldID handle; jfieldID handle;
try { try {
handle = getFieldID(env, "org/pEp/jniadapter/«$jname»", "handle", "J"); handle = getFieldID(env, "org/pEp/jniadapter/«$jname»", "handle", "J");
} }
catch (std::exception& ex) { catch (std::exception& ex) {
assert(0); assert(0);
return NULL; return NULL;
}
return (::«@name» *) (intptr_t) (int64_t) env->GetLongField(me, handle);
} }
};
return (::«@name» *) (intptr_t) (int64_t) env->GetLongField(me, handle);
}
}; };
};
extern "C" { extern "C" {
using namespace pEp::JNIAdapter; using namespace pEp::JNIAdapter;
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_org_pEp_jniadapter_«$jname»_init(JNIEnv *env, jobject obj) { Java_org_pEp_jniadapter_«$jname»_init(JNIEnv *env, jobject obj) {
::«@name» * _obj = ::new_«@name»(PEP_dir_incoming); ::«@name» * _obj = ::new_«@name»(PEP_dir_incoming);
if (!_obj) { if (!_obj) {
outOfMemory(env); outOfMemory(env);
return (jlong) 0; return (jlong) 0;
}
return (jlong) (int64_t) (intptr_t) _obj;
} }
return (jlong) (int64_t) (intptr_t) _obj;
}
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_org_pEp_jniadapter_«$jname»_release(JNIEnv *env, jobject obj, jlong value) { Java_org_pEp_jniadapter_«$jname»_release(JNIEnv *env, jobject obj, jlong value) {
if (value) { if (value) {
::«@name» *_obj = (::«@name» *) (intptr_t) (int64_t) value; ::«@name» *_obj = (::«@name» *) (intptr_t) (int64_t) value;
::free_«@name»(_obj); ::free_«@name»(_obj);
}
} }
||
apply "*[name(.)!='enum']", 0, mode=entry {
with "name", "@name";
with "class" call "CamelCase" with "text", "@name";
}
||
} // extern "C"
||
} }
}
`` apply "*[name(.)!='enum']", 0, mode=entry with "name", "@name", with "class" call "CamelCase" with "text", "@name"; function "mangle" {
} // extern "C" param "type";
param "name";
param "classname" call "CamelCase" with "text", "../@name";
const "convert", "$type != 'timestamp'";
|| choose {
when "$convert"
> «concat('Java_org_pEp_jniadapter_', $classname, '__1', str:replace($name, '_', '_1'))»
otherwise
> «concat('Java_org_pEp_jniadapter_', $classname, '_', str:replace($name, '_', '_1'))»
}
} }
template "*", mode=entry { template "*", mode=entry {
@ -76,10 +96,17 @@ tstylesheet {
const "jname" call "CamelCase" with "text", "name(*[1])"; const "jname" call "CamelCase" with "text", "name(*[1])";
const "cname" call "lcase" with "text", "name(*[1])"; const "cname" call "lcase" with "text", "name(*[1])";
const "type", "name(.)"; const "type", "name(.)";
const "getname" call "mangle" {
with "type", "$type";
with "name", "concat('get', $jname)";
}
const "setname" call "mangle" {
with "type", "$type";
with "name", "concat('set', $jname)";
}
|| ||
JNIEXPORT `call "jni_type" with "type", "name(.)"` JNICALL JNIEXPORT `call "jni_type" with "type", "name(.)"` JNICALL
Java_org_pEp_jniadapter_«$class»_get«$jname»(JNIEnv *env, jobject obj) { «$getname»(JNIEnv *env, jobject obj) {
«$name» *_obj = «$name»_ptr(env, obj); «$name» *_obj = «$name»_ptr(env, obj);
|| ||
choose { choose {
@ -92,7 +119,7 @@ tstylesheet {
} }
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_org_pEp_jniadapter_«$class»_set«$jname»(JNIEnv *env, jobject obj, `call "jni_type" with "type", "name(.)"` value) { «$setname»(JNIEnv *env, jobject obj, `call "jni_type" with "type", "name(.)"` value) {
«$name» *_obj = «$name»_ptr(env, obj); «$name» *_obj = «$name»_ptr(env, obj);
|| ||
choose { choose {

4
test/Makefile

@ -2,10 +2,10 @@ CLASSPATH=.:../src
VM=java -Djava.library.path=../src VM=java -Djava.library.path=../src
test: Testing.class test: Testing.class
$(VM) Testing CLASSPATH=$(CLASSPATH) $(VM) Testing
%.class: %.java %.class: %.java
javac $< CLASSPATH=$(CLASSPATH) javac $<
.PHONY: clean .PHONY: clean

8
test/Testing.java

@ -1,6 +1,7 @@
import org.pEp.jniadapter.Engine; import org.pEp.jniadapter.Engine;
import org.pEp.jniadapter.pEpException; import org.pEp.jniadapter.pEpException;
import org.pEp.jniadapter.Identity; import org.pEp.jniadapter.Identity;
import org.pEp.jniadapter.Message;
class Testing { class Testing {
public static void main(String[] args) { public static void main(String[] args) {
@ -22,6 +23,13 @@ class Testing {
String t = e.trustwords(vb); String t = e.trustwords(vb);
System.out.print("Trustwords: "); System.out.print("Trustwords: ");
System.out.println(t); System.out.println(t);
// message
Message msg = new Message();
Identity from = new Identity();
from.username = "Volker Birk";
from.address = "vb@dingens.org";
msg.setFrom(from);
} }
} }

Loading…
Cancel
Save