0

nif私はアーランでライブラリを書いています。loadまた、関数upgradeも書きunloadます。

これは私のコードです:

#include "erl_nif.h"


int checksum(char *s)
{
    return 123;
}


/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////


static ERL_NIF_TERM
checksum_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    return enif_make_int(env, checksum(""));
}


/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////


static int
load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
    *priv_data = enif_open_resource_type(env,
                                         NULL,
                                         "cwm_utils_buf",
                                         NULL,
                                         ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER,
                                         NULL);
    return 0;
}


static int
upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info)
{
    *priv_data = enif_open_resource_type(env,
                                         NULL,
                                         "cwm_utils_buf",
                                         NULL,
                                         ERL_NIF_RT_TAKEOVER,
                                         NULL);
    return 0;
}


static void
unload(ErlNifEnv* env, void* priv_data)
{
    return ;
}


static ErlNifFunc nif_funcs[] = {
    {"checksum", 1, checksum_nif}
};



ERL_NIF_INIT(mynif, nif_funcs, &load, NULL, &upgrade, &unload);

erlang シェルでこれをロードして関数nifを実行checksumすると、戻り123、すべて問題ありません!

その後、戻り値をchecksumto に変更し、コマンドを使用して to erlang vm を123456コンパイルしてロードします。nifl(mynif)

これが問題です!関数を実行checksumすると、戻り値はそうでなければなりませんが123445、まだアップグレードされていません。123nif

何が問題ですか?私はよく検索し、いくつかの例とライブラリをテストしましたjiffyが、うまくいきませんでした。

4

1 に答える 1

1

試す:

code:purge(mynif).
code:delete(mynif).
l(mynif).
于 2016-06-07T08:17:25.677 に答える