I have a simple JLink function as follows:
Needs["JLink`"]
sha256Signature[bytesList_] :=
JavaBlock[
Module[{sig, mdc, mdo},
InstallJava[];
mdc = LoadJavaClass["java.security.MessageDigest"];
mdo = mdc.getInstance["SHA-256"];
mdo[update[bytesList]];
sig = mdo[digest];
ReleaseJavaObject[mdo];
Return[sig]
]
];
sha256Signature[byteList]
It produces the following output
(JLink`JavaClass["java.security.MessageDigest", 0, {JLink`JVM["vm1"]}, 1,
java`security`MessageDigest`", False, True].getInstance["SHA-256"])[digest]
There is no error indication, but the code doesn't seem to do anything. I must be missing something simple.
Making suggested modifications (see below)
Needs["JLink`"];
InstallJava[];
sha256Signature[bytesList_] :=
JavaBlock[
Module[{sig, mdc, mdo},
mdc = LoadJavaClass["java.security.MessageDigest"];
mdo = MessageDigest`getInstance["SHA-256"];
mdo[update[bytesList]];
sig = mdo[digest];
ReleaseJavaObject[mdo];
Return[sig]
]
];
sha256Signature[byteList]
Produces
Java::fldx: Attempting to set field named digest defined in class
java.security.MessageDigest$Delegate to an incorrect type of value:
JavaObject[java.security.MessageDigest$Delegate]».
$Failed
"]; (and put a ; after both). Change mdc.getInstance to essageDigest
getInstance. Now what is your value for byteList? $\endgroup$mdo[digest]
andmdo@digest
are truly equivalent, the former notation is very confusing and it's not how J/Link was designed to be used. Please usemdo@digest
. With this notation it immediately becomes clear that you forgot the function call brackets:mdo@digest[]
. This is visually analogous tomdo.digest()
in Java, just replace.
by@
and()
by[]
. $\endgroup$