通常,使用直接的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