動的ライブラリの生成と差下請けライブサーバー-7-bsdiffをコンパイルします。

bsdiffとBSPATCHは、下請BSPATCHが古いファイルと貧しいを通じて新しいファイルを生成し、バイナリパッチツールが悪い下請けによって生成bsdiff古いものと新しいファイルで生成して適用するために使用下請けを通じて貧しい伝達され、効果的にネットワーク間のトラフィックの伝送を減らすことができますし、時間。それはBSPATCH bsdiffのBZIP2に基づいて、前記デフォルト位置は、/ usr / binです。動作中のbsdiffとBSPATCHは最大のために、必要なメモリ空間bsdiff、mは新しいファイルのサイズで、nはと仮定すると、古いファイルのサイズは、メモリ空間と多くの時間を消費する必要があります(17 のn ,. 9 N + M)+ O (1)バイト;必要BSPATCH N + M + O(1)バイト。

まず、bsdiffの公式ウェブサイトは、あなたが直接ソースのこのbsdiff-4.3バージョンをダウンロードすることができますが、ソースのこのバージョンは、唯一のLinuxシステムをサポートし、コンパイラは、Windowsのシステムをサポートしていない、あなたは、Windowsのバージョンを確認する必要があります。

bsdiffの窓の下でコンパイルされました

次のステップ:

  1. パラメータが必要なものをmain()関数を見ます
  2. Javaクラスは、JNIヘッダファイルを作成します
  3. bsdiff VSおよび変更へのソースコード
  4. VSによって動的ライブラリにコンパイル

1.パラメータが必要なものをmain()関数をチェック

Windows版bsdiffファイルのディレクトリを見てください:

写真.PNG

まず、コードのように行のファイルbsdiff.cppのmain()関数を見てみましょう。

if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
复制代码

main()関数を表示する通過四つのパラメータをとり、任意の充填の最初のパラメータ、及びメイン(方法)関数を読み続ける残りの3つのパラメータは、古いファイル・パス、ファイルパスと新しいサブ間の差であることとすることができますパス。

2. Javaクラス、JNIヘッダファイルを作成

だから我々は、JavaコードとJNIコードを書くことができます。

public class BsDiff {

    public native static void diff(String oldFile, String newFile, String patchFile);

    static {
//        LibLoader.loadLib("Bsdiff.dll");
        LibLoader.loadLib("Bsdiff.so");
    }
}
复制代码

コンパイルし、生成されたクラスファイル、ヘッダファイルは、JNIアイデアIDEを生成しました。カスタムツール以下、ブロックを設定するには

javahはツール.PNG
次に、ツールを起動するには、このクラスBsDiff JNIヘッダファイルを生成することができます。
JNIヘッダファイルを生成します.PNG
ファイルを次のようにヘッダー:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ljh_jni_BsDiff */

#ifndef _Included_com_ljh_jni_BsDiff
#define _Included_com_ljh_jni_BsDiff
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ljh_jni_BsDiff
 * Method:    diff
 * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_ljh_jni_BsDiff_diff
  (JNIEnv *, jclass, jstring, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif
复制代码

VSと修正に3 bsdiffソースコード

VSで、新しい空のプロジェクトを作成し、インポートbsdiffウィンドウソースコード、jni.h中、jni_md.hとちょうどプロジェクトにJNIヘッダファイルからコンパイルします。プロジェクトディレクトリ以下のように:

写真.PNG
次いで、全体の呼は、差分サブを生成するために、JNIの方法、任意の元のコールメインbsdiff()関数を介して論理なる製造、ソースコードを変更します。JNIヘッダファイルヘッダファイルローカルとして修正(com_ljh_jni_BsDiff.h)参考文献:

#include <jni.h>     ->    #include "jni.h"
复制代码

bsdiff.cppソースファイルにおいて、JNIヘッダファイルを追加し、main()関数の名前を変更し、実装JNI機能を追加します。

1. #include "com_ljh_jni_BsDiff.h"

2.  int main(int argc,char *argv[]){ ... }  -> int bsdiff_main(int argc,char *argv[]){...}

3. 
//JNI调用
JNIEXPORT void JNICALL Java_com_ljh_jni_BsDiff_diff
(JNIEnv* env, jclass jcls, jstring oldfile_jstr, jstring newfile_jstr, jstring patchfile_jstr) {
	int argc = 4;
	char* oldfile = (char*)env->GetStringUTFChars(oldfile_jstr, NULL);
	char* newfile = (char*)env->GetStringUTFChars(newfile_jstr, NULL);
	char* patchfile = (char*)env->GetStringUTFChars(patchfile_jstr, NULL);

	//参数(第一个参数无效)
	char* argv[4];
	argv[0] = (char *)"bsdiff";
	argv[1] = oldfile;
	argv[2] = newfile;
	argv[3] = patchfile;

	bsdiff_main(argc, argv);

	env->ReleaseStringUTFChars(oldfile_jstr, oldfile);
	env->ReleaseStringUTFChars(newfile_jstr, newfile);
	env->ReleaseStringUTFChars(patchfile_jstr, patchfile);
}
复制代码

動的ライブラリにコンパイルVS 4.

プロジェクトのプロパティでは、異常に、このようなセキュリティチェックを解除コンパイルするコマンドラインを追加

-D _CRT_SECURE_NO_WARNINGS -D _CRT_NONSTDC_NO_DEPRECATE 
复制代码

写真.PNG
次いで、従来の構成では、動的タイプライブラリ(.dllファイル)を設定するように構成された、コンパイルすることができます。コンパイルが成功した後、JNIを呼び出します
写真.PNG

Linuxがbsdiffでコンパイルされます

ウィンドウでコンパイルのLinuxのステップbsdiffのように:

  1. コンパイル環境の設定
  2. Javaクラスは、JNIヘッダファイルを作成します
  3. JNIは、ヘッダファイル、ソースコードを変更します
  4. 動的ライブラリにコンパイルの.so

1.コンパイル環境の設定

BZIP2とgccコンパイラの必要性、インストール手順により、BZIP2

sudo apt-get install libbz2-dev
复制代码

2. Javaクラス、建物ヘッダ3.変更JNI JNIヘッダファイルを、ソースコードの参照ウィンドウをコンパイル

4.動的ライブラリはコンパイルの.so

gcc bsdiff.c -lbz2 -fPIC -shared -o bsdiff.so
复制代码

おすすめ

転載: juejin.im/post/5d5d3c096fb9a06b10272f23