jar-Datei mit icon



  • Hallo!

    Bitte wegen dem Titel nichts falsches denken, ich bin hier schon im richtigen Forum.
    Also erstmal die kurze Vorgeschichte: ich hab in java ein programm geschrieben, des inne .jar gepackt. Dieser jar würd ich eben gerne ein icon geben - aber das ist meines Wissens nicht möglich (zumindest nicht spezifisch für eine Datei).

    Und jetzt kommts was ich im Winapi board will:
    Hab mir überlegt ich könnte doch ne Art wrapper schreiben, der des binary von der jar-Datei nimmt, und in eine .exe speichert, mit dem richtigen Icon dazu. Und diese exe soll dann die jvm ausfindig machen und die gespeicherte jar-Datei damit ausführen.

    Hat da generell jemand Vorschläge wie ich das am besten machen kann? Vor allem auch, dass ich das Icon dynamisch der "generierten" exe zuweisen kann?

    Und wie führe ich die jar-Datei mit der jvm aus? muss ich sie dazu an einen temporären Ort entpacken um sie mit "java -jar ..." auszuführen oder kann ich das auch im cache machen?

    Danke für die Antworten und hilfreiche Ideen 😉

    mfg jghj



  • Stichwort: JNI = Java Native Interface

    Aber nur damit die Datei ein Icon hat, würde ich den Aufwand nicht betreiben.



  • JNI kenn ich. Aber ich dachte ich kann nur mit java darauf zugreifen und nicht umgedreht.
    Wenn dem nicht so ist, kann ich dann mit meinem Programm einfach die main() Methode aus meinem Java aufrufen?



  • Es geht auch umgekehrt. Ich arbeite mich da gerade ein:

    #include "jni.h"
    #include <tchar.h>
    #include <stdio.h>
    #include <windows.h>
    #include <shlwapi.h>
    #include "main.h"
    #include "MpuTools.h"
    
    int main() {
    	JavaVM *jvm = NULL;
    	JavaVMInitArgs vm_args;
    	JavaVMOption options[1];
    	JNIEnv *env = NULL;
    
    	// Optionen und JVM Argumente setzen
    	options[0].optionString = "-Djava.class.path=..\\JavaDemo";
    	memset(&vm_args, 0, sizeof(vm_args));
    	vm_args.version = JNI_VERSION_1_4;
    	vm_args.options = options;
    	vm_args.nOptions = 1;
    	vm_args.ignoreUnrecognized = JNI_FALSE; 
    
    	// DLL laden
    	HINSTANCE hLib = LoadLibrary(DLLPATH);
    	if (hLib == NULL) {
    		LPTSTR pszBuf;
      		pszBuf = SysErrorMessage(0, NULL, 0);
      		_tprintf(_T("%s\n"), pszBuf);
      		LocalFree(pszBuf);
      		return -1;
    	}
    	else {
    		_tprintf(_T("DLL %s geladen. (0x%x)\n"), PathFindFileName(DLLPATH), (int)hLib);
    	}
    
    	// Prozedureinsprungspunkt holen
    	JNI_CREATEJAVAVM jni_createjavavm = (JNI_CREATEJAVAVM) GetProcAddress(hLib, DLL_JNI_CREATE_JVM);
    	if (jni_createjavavm == NULL) {
    		LPTSTR pszBuf;
      		pszBuf = SysErrorMessage(0, NULL, 0);
      		_tprintf(_T("%s\n"), pszBuf);
      		LocalFree(pszBuf);
      		getchar();
      		return -1;	
    	}
    	else {
    		_tprintf(_T("Prozedureinsprungspunkt gefunden. (0x%x)\n\n"), (int)jni_createjavavm);
    	}
    
    	// JVM starten
    	int status = jni_createjavavm(&jvm, (void **)&env, &vm_args);
    	    if (status != JNI_OK) {
        	switch (status) {
        		case JNI_ERR:
    				printf("Error: %d\nunknown error\n", status);
    				break;
    			case JNI_EDETACHED:
    				printf("Error: %d\nthread detached from the VM\n", status);
    				break;
    			case JNI_EVERSION:
    				printf("Error: %d\nJNI version error\n", status);
    				break;
    			case JNI_ENOMEM:
    				printf("Error %d:\nnot enough memory\n", status);
    				break;
    			case JNI_EEXIST:
    				printf("Error %d:\nVM already created\n", status);
    				break;
    			case JNI_EINVAL:
    				printf("Error %d\ninvalid arguments\n", status);
    				break;
        	} 	
        	return -1;
        }
        else {
        	_tprintf(_T("JVM created successfully\n\n"));
        }
    
        // Klasse der aufzurufenden Methode suchen
        jclass cls = env->FindClass("HelloWorld");
        if (cls == 0) {
        	_tprintf(_T("Klasse 'HelloWorld' nicht gefunden\n"));
        	jvm->DestroyJavaVM();
        	return -1;	
        }
        else {
        	_tprintf(_T("Klasse 'HelloWorld' gefunden\n"));
        }
        // Konstruktor aufrufen
        jmethodID mid = env->GetMethodID(cls, "<init>", "()V");
        if (mid == 0) {
        	_tprintf(_T("Konstruktor nicht gefunden.\n"));
        	jvm->DestroyJavaVM();
        	return -1;
        }
        else {
        	_tprintf(_T("Konstruktor gefunden.\n"));
        }
        // Objektinstanz erzeugen
        jobject instance = env->NewObject(cls, mid);
        if (instance == 0) {
        	_tprintf(_T("Instanz konnte nicht erzeugt werden.\n"));
        	jvm->DestroyJavaVM();
        	return -1;
        }
        else {
        	_tprintf(_T("Instanz erzeugt. (0x%x)\n\n"), (int)instance);
        }
    
        // Java Methode IntTest
        mid = env->GetMethodID(cls, "intTest", "()I");
        if (mid == 0) {
        	_tprintf(_T("Methode 'iniTest' nicht gefunden.\n"));
        	jvm->DestroyJavaVM();
        	return -1;
        }
        else {
        	_tprintf(_T("Methode 'iniTest' gefunden.\n"));
        }	
    	int res = env->CallIntMethod(instance, mid);
    	_tprintf(_T("Rückgabewert der Methode 'initTest': %i\n\n"), res);
    
    	// Java Methode intTest2
    	mid = env->GetMethodID(cls, "intTest2", "(I)I");
        if (mid == 0) {
        	_tprintf(_T("Methode 'iniTest2' nicht gefunden.\n"));
        	jvm->DestroyJavaVM();
        	return -1;
        }
        else {
        	_tprintf(_T("Methode 'iniTest2' gefunden.\n"));
        }	
    	res = env->CallIntMethod(instance, mid, 7);
    	_tprintf(_T("Rückgabewert der Methode 'initTest2': %i\n\n"), res);
    
    	// Java Methode strTest
    	mid = env->GetMethodID(cls, "strTest", "()Ljava/lang/String;");
    	if (mid == 0) {
        	_tprintf(_T("Methode 'strTest' nicht gefunden.\n"));
        	jvm->DestroyJavaVM();
        	return -1;
        }
        else {
        	_tprintf(_T("Methode 'strTest' gefunden.\n"));
        }
        jstring js = (jstring)env->CallObjectMethod(instance, mid);
        const TCHAR* c_str = env->GetStringUTFChars(js, 0);
        _tprintf(_T("Rückgabewert der Methode 'strTest': %s\n\n"), c_str);	
    
    	// Programmende
    	_tprintf(_T("The end .. to be continued..."));
    
    	jvm->DestroyJavaVM();
    	return 0;	
    }
    

    😉


Anmelden zum Antworten