1

暗号化や署名などのセキュリティモジュールを実行するプログラムを作成しています...上記の機能を実行するライブラリをCで作成しました。現在、jniを使用してJavaからこのCネイティブ関数を呼び出しています。

私が直面している問題は、結果(署名されたデータまたは暗号化されたデータ)をJavaによって渡されたパラメーターに格納できないことです。受け取ったパラメータに結果を保存したい。私を助けてください。よろしくお願いします。

以下は、ネイティブ関数を呼び出すためにJavaで使用するAPIです。

sign("sign",byte[] file,int filelen,byte[] output,int outputlen)

ネイティブC呼び出しでは、入力ファイルの内容で構成されるバッファである「ファイル」のサインオンを実行し、それを出力に保存したいと思います。どうすればそれを行うことができますか誰かが私を助けることができます私は関連情報を見つけられませんでした。

4

2 に答える 2

1

通常、ネイティブライブラリは直接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;
}

これは、アイデアを広めるのに十分なはずです。動作中のコードから言い換えられていますが、現在の形式ではテストされていません。

于 2012-07-14T22:17:31.113 に答える
0

次のコードを使用すると、ネイティブコードが両方のプリミティブバイト配列入力の内容に直接アクセスできます。

JNIEXPORT void JNICALL Java_*mypackage*_sign(JNIEnv* env, jbytearray input, jint ilen, jbytearray output, jint olen) {
  char* pinput = (*env)->GetByteArrayElements(env, input, NULL);
  char* poutput = (*env)->GetByteArrayElements(env, output, NULL);

  sign(pinput, ilen, poutput, olen);

  (*env)->ReleaseByteArrayElements(env, input, pinput, 0);
  (*env)->ReleaseByteArrayElements(env, output, poutput, 0);
}

パフォーマンスの考慮事項に応じて(つまり、配列データのコピーを回避したい場合、またはバイト配列への同時アクセスを回避したい場合)、を使用する例GetPrimitiveArrayCriticalを次に示します。

NIO /ダイレクトバッファは、単一の関数呼び出しの期間より長くネイティブコードとJavaコードの間でバッファを共有する必要がある場合にのみ推奨されます。

于 2012-07-15T13:09:28.320 に答える