通常,使用直接的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;
}
这应该足以传达出的主意。它是从工作代码中解释出来的,但是没有经过当前的测试。
Java按值传递参数,所以您将无法为参数分配值。不过,您可以填写给定的字节数组。而Java数组有一个'length'属性,所以将这个长度作为附加参数传递是没有用的。 – 2012-07-14 09:46:27