通常,使用直接 ByteBuffer 调用本机库。
接口是MyClass.submit(ByteBuffer source, ByteBuffer dest)
static jmethodID ByteBuffer_position;
static jmethodID ByteBuffer_limit;
// Find method id's for ByteBuffer methods.
JNIEXPORT jint JNICALL Java_MyClass_initAPI
(JNIEnv *env, jclass thisj) {
jint error = 0;
ByteBuffer_position = (*env)->GetMethodID(env, byteBufferClass, "position", "()I");
if (ByteBuffer_position == NULL) error = -1;
ByteBuffer_limit = (*env)->GetMethodID(env, byteBufferClass, "limit", "()I");
if (ByteBuffer_limit == NULL) error = -1;
return error;
}
// Get ByteBuffer pointers and sizes and encrypt
// Expects source buffer's position to indicate end of source
// Expects dest buffer's limit to indicate max output length
JNIEXPORT jint JNICALL Java_MyClass_submit (JNIEnv *env, jobject thisj,
jobject sourceBuffer, jobject destBuffer ) {
jint error = 0;
unsigned char* sourcePtr = (*env)->GetDirectBufferAddress(env, source);
unsigned char* destPtr = (*env)->GetDirectBufferAddress(env, dest);
jlong sourceLen = (*env)->CallIntMethod(env, source, ByteBuffer_position);
jlong destLen = (*env)->CallIntMethod(env, dest, ByteBuffer_limit);
// Encrypt sourcePtr --> destPtr
return error;
}
这应该足以传达这个想法。它是从工作代码中转述出来的,但未经当前形式的测试。