JNIEXPORT jboolean JNICALL Java_org_phash_MVPTree_add (JNIEnv *e, jobject ob, jobjectArray hashArray) { MVPFile mvpfile; jniHashType type; ph_mvp_init(&mvpfile); jsize len; if(hashArray == NULL || (len = e->GetArrayLength(hashArray)) == 0) return JNI_FALSE; jstring mvp = (jstring)e->GetObjectField(ob, e->GetFieldID(e->FindClass("org/phash/MVPTree"), "mvpFile", "Ljava/lang/String;")); mvpfile.filename = strdup(e->GetStringUTFChars(mvp, 0)); int i; jobject hashObj = e->GetObjectArrayElement(hashArray, 0); for(i = 0; i < sizeof(hashes)/sizeof(hashes[0]); i++) { if(e->IsInstanceOf(hashObj, *hashes[i].cl)) { mvpfile.hashdist = hashes[i].callback; mvpfile.hash_type = hashes[i].hashType; type = hashes[i].kind; break; } } const char *hash_file = NULL; DP **newHashes = (DP **)malloc(len*sizeof(DP *)); jintArray hashList = NULL; for(int j = 0; j < len; j++) { newHashes[j] = ph_malloc_datapoint(mvpfile.hash_type); hashObj = e->GetObjectArrayElement(hashArray, j); jstring hashStr = (jstring)e->GetObjectField(hashObj, hash_filename); hash_file = e->GetStringUTFChars(hashStr, 0); newHashes[j]->id = strdup(hash_file); e->ReleaseStringUTFChars(hashStr, hash_file); jint *hash_list = NULL; switch(type) { case IMAGE_HASH: { if(e->IsInstanceOf(hashObj, dctImClass)) { newHashes[j]->hash_length = 1; ulong64 hash = (ulong64)e->GetLongField(hashObj, dctImHash_hash); newHashes[j]->hash = (ulong64 *)malloc(sizeof(ulong64)); *(ulong64 *)newHashes[j]->hash = hash; } else if(e->IsInstanceOf(hashObj, mhImClass)) { jbyteArray h = (jbyteArray)e->GetObjectField(hashObj, mhImHash_hash); newHashes[j]->hash_length = e->GetArrayLength(h); jbyte *hash = e->GetByteArrayElements(h, NULL); newHashes[j]->hash = (uint8_t*)hash; } else if(e->IsInstanceOf(hashObj, radialImClass)) { jbyteArray h = (jbyteArray)e->GetObjectField(hashObj, radialImHash_hash); newHashes[j]->hash_length = e->GetArrayLength(h); jbyte *hash = e->GetByteArrayElements(h, NULL); newHashes[j]->hash = (uint8_t*)hash; } break; } case VIDEO_HASH: { jlongArray l = (jlongArray)e->GetObjectField(hashObj, vidHash_hash); newHashes[j]->hash_length = e->GetArrayLength(l); jlong *h = e->GetLongArrayElements(l, NULL); newHashes[j]->hash = (ulong64*)h; break; } case AUDIO_HASH: { hashList = (jintArray)e->GetObjectField(hashObj, audioHash_hash); newHashes[j]->hash_length = e->GetArrayLength(hashList); hash_list = e->GetIntArrayElements(hashList, NULL); newHashes[j]->hash = (uint32_t*)hash_list; break; } } } int nbsaved = 0; int res = ph_add_mvptree(&mvpfile, newHashes, len, nbsaved); for(int j = 0; j < len; j++) { if(type == AUDIO_HASH) { hashObj = e->GetObjectArrayElement(hashArray, j); hashList = (jintArray)e->GetObjectField(hashObj, audioHash_hash); e->ReleaseIntArrayElements(hashList, (jint *)newHashes[j]->hash, JNI_ABORT); } ph_free_datapoint(newHashes[j]); } e->ReleaseStringUTFChars(mvp, mvpfile.filename); free(newHashes); free(mvpfile.filename); return JNI_TRUE; }
int main(int argc, char **argv){ if (argc < 3){ printf("not enough input args\n"); printf("usage: %s directory filename\n", argv[0]); return -1; } const char *dir_name = argv[1];/* name of dir to retrieve image files */ const char *filename = argv[2];/* name of file to save db */ MVPFile mvpfile; mvpfile.filename = strdup(filename); mvpfile.hashdist = distancefunc; mvpfile.hash_type = UINT64ARRAY; int nbfiles = 0; printf("dir name: %s\n", dir_name); char **files = ph_readfilenames(dir_name,nbfiles); if (!files){ printf("mem alloc error\n"); return -2; } printf("nbfiles = %d\n", nbfiles); DP **hashlist = (DP**)malloc(nbfiles*sizeof(DP*)); if (!hashlist){ printf("mem alloc error\n"); return -3; } int count = 0; ulong64 tmphash = 0; for (int i=0;i<nbfiles;i++){ hashlist[count] = ph_malloc_datapoint(mvpfile.hash_type); if (hashlist[count] == NULL){ printf("mem alloc error\n"); return -4; } hashlist[count]->hash = malloc(sizeof(ulong64)); if (hashlist[count]->hash == NULL){ printf("mem alloc error\n"); return -5; } printf("file[%d] = %s\n", i, files[i]); if (ph_dct_imagehash(files[i],tmphash) < 0){ printf("unable to get hash\n"); free(hashlist[count]->hash); ph_free_datapoint(hashlist[count]); continue; } hashlist[count]->id = files[i]; *((ulong64*)hashlist[count]->hash) = tmphash; hashlist[count]->hash_length = 1; count++; } printf("add files to file %s\n", filename); int nbsaved; MVPRetCode ret = ph_add_mvptree(&mvpfile, hashlist, count,nbsaved); printf("number saved %d out of %d, ret code %d\n", nbsaved,count,ret); for (int i=0;i<nbfiles;i++){ free(files[i]); } free(files); for (int i=0;i<nbfiles;i++){ free(hashlist[i]->hash); ph_free_datapoint(hashlist[i]); } free(hashlist); return 0; }