私はこの質問が以前に尋ねられたことは知っていますが、私はこの文脈では答えが異なると思います。だから、基本的に私はこのように見えた、機能シールや開封が含まれているCライブラリを持っている:JNIでの参照渡し方は?
JNIEXPORT jint JNICALL Java_JavaTest_securesdk_1seal_1data
(JNIEnv *env, jobject obj, jlong handle, jbyteArray data, jint size)
{
const char *cData = (*env)->GetByteArrayElements(env, data NULL);
jint token = securesdk_seal_data(handle, cData, size);
(*env)->ReleaseByteArrayElements(env, data, cData, JNI_ABORT);
return token;
}
JNIEXPORT jint JNICALL Java_JavaTest_securesdk_1unseal_1data
(JNIEnv *env, jobject obj, jlong handle, jint token, jbyteArray data, jint size)
{
const char *buffer = (*env)->GetByteArrayElements(env, data NULL);
jsize length = (*env)->GetArrayLength(env,data);
jlong address = securesdk_unseal_data(handle, token, buffer, size);
for(int i=0; i<length; i++){
printf("%i\n", buffer[i])
}
(*env)->ReleaseByteArrayElements(env, data, buffer, JNI_ABORT);
return address;
}
基本的にシール機能は、Java側とフラッシュメモリに保存するには、バイト配列になります(心配しないでくださいどのように動作するか)、トークンを返します。 unseal関数は、空のバイト配列バッファとトークンを取り込み、空のバッファをデータで埋めます。ここにJavaコードとその出力内容を示します。
class JavaTest{
public native int securesdk_seal_data(long handle, byte[] data, int size);
public native int securesdk_unseal_data(long handle, int token, byte[] data, int size);
JavaTest test = new JavaTest();
String data = "hello";
byte[] cmdbuf = data.getBytes();
int token = test.securesdk_seal_data(sdk, cmdbuf, cmdbuf.length);
byte[] emptybuf = new byte[10];
long returnData = test.securesdk_unseal_data(sdk, token, emptybuf, emptybuf.lenth);
for(int i=0; i<emptybuf.length; i++){
System.out.print(emptybuf[i]);
}
}
Javaコードを実行すると、Cコードのprintf文から "hello"のバイトが出力されます。私が空のバッファを渡すと、それは私が元々封印したデータで満たされています。これは正しいです。しかし、Javaでunseal関数を呼び出した後で塗りつぶしたバッファを印刷しようとすると、空のバッファが返されます。 C関数を呼び出した後、バッファからメモリから更新する方法はありますか?これは可能ですか?私はJavaからemptybufを印刷するときに "hello"のバイトをプリントアウトしたいと思います。代わりJNI_ABORTの開封で