Was ist die JNI-äquivalent in einen unsigned char-pointer?
Habe ich eine Funktion in C:
mySource.c:
int trapdoor(unsigned char keywords[][MAX_SIZE], unsigned int *s, int slen, unsigned char *out, int outlen);
ist und wo der keywords ist ein array von char-arrays (mit keywords in verschiedenen Größen), s ist ein unsigned int mit der Länge slen(EDIT: tatsächlich 128-bit=>also Wert slen 4) und außen ist das Ziel-Zeiger, wo das Ergebnis der Funktion gespeichert ist, und der outlen Länge(EDIT: 256-bit=>also Wert outlen 32).
Hinweis: Da es sich um eine kryptographische Funktion, die ich brauchte, die Datentypen zu werden, der die genaue Größe, die ich erwähnt habe.
Und ich habe Sie zum aufrufen dieser Funktion aus java mittels JNI-Schnittstelle. Was sind nun die äquivalenten Datentypen in java & JNI, dass ich zu Durchlaufen haben, als Parameter aufrufen, um die trapdoor-Funktion in C?
mySource_jni.c:
JNIEXPORT ?? JNICALL Java_proj_trapdoor(JNIEnv *env, jobject obj, ??, ??, ??, ??, ??, ??);
myJavaSource.java:
private native ?? trapdoor_extraction(??, ??, ??, ??, ??);
Fand ich es aus anderen Beiträgen, dass es kein äquivalent zu unsigned-Datentypen in java (korrigiert mich wenn ich falsch Liege).
- Es könnte einfacher sein, zu erklären, das Java-native-Methode als
static
, es sei denn, Sie gehen zu haltenkeywords
in einem Feld, das Lesen Sie in der JNI-code statt es als parameter übergeben. - Wie @JoshDM schlägt vor, Sie sollten sich auf das konzentrieren, was die Daten vor der Zuordnung von Datentypen. Sie erwähnen keywords, sind Sie strings? Wenn ja, welchen Zeichensatz und encoding? Sind
*s
und*out
strings auch, oder nur eine gerade Anzahl von beliebigen bytes und jede beliebige Anzahl von bytes aus? Möglicherweise gibt es technische Einschränkungen intrapdoor
aber der Schwerpunkt sollte sein, wie Sie wollen, es zu benutzen in Java.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wahr, dass Java nicht verwenden unsigned primitive Typen (außer
char
die 16-bit), aber Sie können immer mit einer größeren Präzision.Mein Vorschlag ist die Erstellung einer Methode, die Sinn machen würde es in Java keine Rolle, ob die Argumente sind signierte Datentypen und warf Sie zu unsigned in Ihrem C-Methode.
Also ich würde versuchen, diese zum ersten mal verwenden:
Hinweis: Sie müssen sich nicht übergeben zu müssen, die array-Längen, da kann man die Länge eines Arrays in C Seite mit
env->GetArrayLength()
.char[][]
ohne Vorzeichen ist so, auch wenn der Java-Seite übergibt Werte größer als ein einzelnes Zeichen, das Sie verwenden nur das untere byte, so werden Sie es zu behandeln, alsunsigned char
. Ansonsten können Sieshort
.int[]
Sie nicht erwähnt, welche Art von Daten es speichert. E. g. wenn es ein Schlüssel für die Verschlüsselung, wäre es ok, zum cast jederint
zuunsigned int
. Sonst einlong[]
für diese.byte[]
Ich verstehe, dass Sie Ihre Funktion speichert die Werte hier so sollte das aber egal sein. Sonst einshort
oder eineint
Ich hoffe, es hilft
Java
short
ist 16 bit signed. Wenn Sie wollen, decken die volle Bandbreite von 16 bit unsigned, benötigen Sieint
(32 bit signed).Zeiger dargestellt werden kann, wie
ints
auf 32 bit Systemen oderlongs
auf 32/64 bit Systemen. Wenn Sie nicht brauchen, die Zeiger Größe genaulongs
sind, was Sie wollen für einen Zeiger.Referenz auf die Java-primitiven, überprüfen hier. Beachten Sie, dass diese Größen, im Gegensatz zu c++, sind System-unabhängig.
Gehe ich davon aus, dass durch die '32-byte' meinst du '32-bit', und ebenso für den 16. Der Grund ist, weil eine Zahl mit 32 bytes wäre eigentlich eine 256-bit Zahl.
Diese sind die bit-Zählungen für jedes der Java-Integer:
Aus diesem, ich glaube, das Java-äquivalent wäre:
byte
undbit
. Es gibt keine256-bit
zahlen in C++ oder Java. compnetworking.about.com/cs/basicnetworking/f/bitsandbytes.htmSchreiben Sie Ihre Java-Klasse mit der nativen Methode der erste ist, was Sie erwarten, dass Ihre Daten beim Java erhält.
Dann rufen Sie javah auf, dass die Class-Datei.
Diese generieren von header-und stub-Dateien für die Verwendung in C++, die Sie dann verlängern Sie Ihre design-C++ - Klasse.
Möchten Sie in der Lage sein, um alle Daten enthalten. Also, die größte kleinster-Variablen-Typen verwendet werden sollten. Wie andere bemerkt haben (ich habe von Ihnen positiv bewertet werden kann)
unsigned int
erfordert einelong
undunsigned char
erfordert eineint
, so zerfällt es so:Ungetestete Prototyp, fill-in-the-blanks, gehen Sie Java ein und verwenden Sie javah:
C:
Java:
jlong
im code dann und übergeben Sie es alslong
; erwartenlong
auf die Java-Seite. stackoverflow.com/questions/8012450/...