RouteInfoクラスに幾つかメソッドを足しました

折角ルート情報が取れるところまで出来たので、やっぱりルート情報の追加とか削除とかも欲しくなって作ってしまいました。

addRouteEntry(RouteInfo& entry)
ルート情報の追加
deleteRouteEntry(RouteInfo& entry)
ルート情報の削除

になります。
先ずは、RouteInfo.cppに

/*
 *  ルート情報を追加する
 *  param   : 追加するルート情報(RouteInfoクラス)
 *
 *  return  : bool
 *            true  = 追加できた
 *            false = 追加できなかった
 */
bool RouteInfo::addRouteEntry(RouteInfo& route_info) {
    long retCode = NO_ERROR;
    MIB_IPFORWARDROW row;

    memset(&row, 0, sizeof(MIB_IPFORWARDROW));
    row.dwForwardDest = inet_addr((const char *)_bstr_t(route_info.getDest().c_str()));
    row.dwForwardMask = inet_addr((const char *)_bstr_t(route_info.getMask().c_str()));
    row.dwForwardPolicy = 0;
    row.dwForwardNextHop = inet_addr((const char *)_bstr_t(route_info.getGateway().c_str()));
    unsigned long ifnum = route_info.getIndex();
    if (ifnum == 0) {
        RouteInfo best = getBestRoute(route_info.getGateway(), route_info.getMask());
        ifnum = best.getIndex();
    }
    row.dwForwardIfIndex = ifnum;
    row.dwForwardProto = MIB_IPPROTO_NETMGMT;
    row.dwForwardAge = 0;
    row.dwForwardNextHopAS = 0;
    row.dwForwardMetric1 = (route_info.getMetric() > 0) ? route_info.getMetric() : 1;
    row.dwForwardMetric2 = ~0;
    row.dwForwardMetric3 = ~0;
    row.dwForwardMetric4 = ~0;
    row.dwForwardMetric5 = ~0;

    int metric = row.dwForwardMetric1;
    do {
        for (unsigned int type = MIB_IPROUTE_TYPE_DIRECT; type <= MIB_IPROUTE_TYPE_INDIRECT; type++) {
            row.dwForwardType = type;
            retCode = CreateIpForwardEntry(&row);
            if (retCode == NO_ERROR) {
                break;
            }
        }
        row.dwForwardMetric1 = ++metric;
    } while ((retCode != NO_ERROR) && (metric < 1024));

    if (retCode == NO_ERROR) {
        return true;
    }
    return false;
}

/*
 *  ルート情報を削除する
 *  param   : 削除するルート情報(RouteInfoクラス)
 *
 *  return  : bool
 *            true  = 削除できた
 *            false = 削除できなかった
 */
bool RouteInfo::deleteRouteEntry(RouteInfo& route_info) {
    long retCode = NO_ERROR;
    MIB_IPFORWARDROW row;

    memset(&row, 0, sizeof(MIB_IPFORWARDROW));
    row.dwForwardDest = inet_addr((const char *)_bstr_t(route_info.getDest().c_str()));
    row.dwForwardMask = inet_addr((const char *)_bstr_t(route_info.getMask().c_str()));
    row.dwForwardPolicy = 0;
    unsigned long ifnum = route_info.getIndex();
    if (route_info.getGateway().empty()) {
        RouteInfo best = getBestRoute(route_info.getGateway(), route_info.getMask());
        row.dwForwardNextHop = inet_addr((const char *)_bstr_t(best.getGateway().c_str()));
        ifnum = best.getIndex();
    }
    else {
        row.dwForwardNextHop = inet_addr((const char *)_bstr_t(route_info.getGateway().c_str()));
        if (ifnum == 0) {
            RouteInfo best = getBestRoute(route_info.getGateway(), route_info.getMask());
            ifnum = best.getIndex();
        }
    }
    row.dwForwardIfIndex = ifnum;
    row.dwForwardProto = MIB_IPPROTO_NETMGMT;
    row.dwForwardAge = 0;
    row.dwForwardNextHopAS = 0;
    row.dwForwardMetric1 = 0;
    row.dwForwardMetric2 = ~0;
    row.dwForwardMetric3 = ~0;
    row.dwForwardMetric4 = ~0;
    row.dwForwardMetric5 = ~0;

    for (unsigned int type = MIB_IPROUTE_TYPE_DIRECT; type <= MIB_IPROUTE_TYPE_INDIRECT; type++) {
        row.dwForwardType = type;
        retCode = DeleteIpForwardEntry(&row);
        if (retCode == NO_ERROR) {
            break;
        }
    }

    if (retCode == NO_ERROR) {
        return true;
    }
    return false;
}

の二つのメソッドを追加しました。
ついでにJavaにも実装して、
RouteInfo.javaクラスに

    public static native boolean addRoute(RouteInfo entry);
    public static native boolean delRoute(RouteInfo entry);

を追加した後、いつものようにjavahでヘッダファイルを作成して、
JNIとなるjnirouteinfo.cppに

JNIEXPORT jboolean JNICALL Java_net_RouteInfo_addRoute(JNIEnv *env, jclass cls, jobject entry) {
    RouteInfo rt_entry = load_value(env, entry);
    return (jboolean)RouteInfo::addRouteEntry(rt_entry);
}

JNIEXPORT jboolean JNICALL Java_net_RouteInfo_delRoute(JNIEnv *env, jclass cls, jobject entry) {
    RouteInfo rt_entry = load_value(env, entry);
    return (jboolean)RouteInfo::deleteRouteEntry(rt_entry);
}

を追加しました。
Javaのテストプログラムに

    RouteInfo[] ris = RouteInfo.getRouteList();
    for (int i = 0; i < ris.length; i++) {
        printRoute(ris[i]);
    }
    RouteInfo entry = new RouteInfo(2, "202.239.113.0", "255.255.255.0", "172.16.255.1", 0, 10, false, false);
    RouteInfo.addRoute(entry);
    System.out.println("After add route");
    ris = RouteInfo.getRouteList();
    for (int i = 0; i < ris.length; i++) {
        printRoute(ris[i]);
    }
    RouteInfo.delRoute(entry);
    System.out.println("After delete route");
    ris = RouteInfo.getRouteList();
    for (int i = 0; i < ris.length; i++) {
        printRoute(ris[i]);
    }

のロジックを追加してテストして完了です。