Avatar billede casualty Nybegynder
29. oktober 2003 - 16:18 Der er 36 kommentarer og
1 løsning

Finde system32 mappen

Hvordan kan jeg, i java, hurtigst finde stien til system32 mappen på brugerens computer? Jeg skal bruge den som enten et File eller String Objekt.

Mvh Casualty
Avatar billede casualty Nybegynder
29. oktober 2003 - 16:20 #1
Og kan jeg finde ud af hvilke drevbogstaver der er i brug på brugerens computer?
Avatar billede arne_v Ekspert
29. oktober 2003 - 16:42 #2
Lidt halve svar.

System.getenv virker ikke længere.

Muligheder:
1)  lave noget JNI til at gøre det med (meget simpelt=
2)  starte java med en -Ddir.system32=%windir%\system32 og
    så bruge System.getProperty("dir.system32")

Hvis du skal bruge det i en GUI så er der JFileChooser.
Avatar billede casualty Nybegynder
29. oktober 2003 - 17:01 #3
Hvad mener du med nr1? >> (meget simpelt=
Avatar billede arne_v Ekspert
29. oktober 2003 - 17:19 #4
Skrive et lille bitte stykke C/C++ kode som kalder getenv i C og kalde
det fra Java.

Det bør være ret simpelt.

Og så kan man få fat i windir variablen den vej.
Avatar billede casualty Nybegynder
29. oktober 2003 - 17:51 #5
Det prøver jeg... Ved du så om jeg kan lægge en xxx.dll fil i min xxx.jar fil og når jeg starter applikationen i xxx.jar filen op så loader den xxx.dll ind som byte[]??
Avatar billede arne_v Ekspert
29. oktober 2003 - 18:35 #6
Nej - DLL filen skal være "on disk".

(muligvis kan du lade koden i jar-filen pakke den ud til disk !)
Avatar billede casualty Nybegynder
29. oktober 2003 - 18:45 #7
Det var det jeg mente..Jeg læser dllfilen ind som byte[] fra jarfilen og gemmer den på disken..Men dette virker ikke kan du se nogle fejl?

try
      {
        InputStream is = getClass().getResource("dlls/DesktopIndicator.dll").openStream();
        byte[] contents = new byte[is.available()];
        is.read(contents);
        is.close();
        if (contents!=null)
        {
          FileOutputStream os = new FileOutputStream("C:/DesktopIndicator.dll");
          os.write(contents);
          os.close();
        }
      }
      catch(Exception e)
      {
        tf.write(e+"");
      }
Avatar billede casualty Nybegynder
29. oktober 2003 - 18:48 #8
Min jarfil er opbygget således:

dlls
    DesktopIndicator.dll

META-INF
    MANIFEST.MF

readjar
    Start.class
    TestFrame.class
Avatar billede casualty Nybegynder
29. oktober 2003 - 18:52 #9
Jeg fik inspiration fra dette spørgsmål: http://www.eksperten.dk/spm/384262
(Som du også deltager i)
Avatar billede casualty Nybegynder
29. oktober 2003 - 19:03 #10
Selvom jeg nu ser at det aldrig kom til at virke...men det må da kunne lade sig gøre...
Avatar billede arne_v Ekspert
29. oktober 2003 - 19:21 #11
Umiddelbart ser koden OK ud !

Hvad sker der ?

(jeg tror at problemet i det spm. drejer sig om text fil og linie sepratorer -
ikke noget problem her)
Avatar billede casualty Nybegynder
29. oktober 2003 - 19:24 #12
Jeg får en nullpointer exeption
Avatar billede casualty Nybegynder
29. oktober 2003 - 19:28 #13
Jeg tror det er fra denne linie

InputStream is = getClass().getResource("dlls/DesktopIndicator.dll").openStream();
Avatar billede casualty Nybegynder
29. oktober 2003 - 19:55 #14
Det virker hvis jeg gør således:

InputStream is = getClass().getResource("DesktopIndicator.dll").openStream();

Og lægger min "DesktopIndicator.dll" sammen med .class filerne

Den kan åbenbart ikke finde stien "dlls"
Avatar billede arne_v Ekspert
29. oktober 2003 - 20:32 #15
Det virker så. Godt.

Skal du have lidt assistance til JNI'en ?
Avatar billede casualty Nybegynder
29. oktober 2003 - 20:44 #16
Ja det ville være rigtig lækkert...Jeg har aldrig kodet i C/C++ og heller ikke arbejdet så meget med JNI...
Avatar billede arne_v Ekspert
29. oktober 2003 - 20:46 #17
Har du en C/C++ compiler ? Hvis ja - hvilken ?
Avatar billede casualty Nybegynder
29. oktober 2003 - 20:53 #18
Nej desværre...Kan du anbefale én der er hurtig at hente?
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:06 #19
mingw
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:07 #20
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:08 #21
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:08 #22
Avatar billede casualty Nybegynder
29. oktober 2003 - 21:11 #23
Jeg har hentet mingw32-make-3.80.0-3.exe..Er det den...der er jo 7000 forskellige ...w32 må være til win32
Avatar billede casualty Nybegynder
29. oktober 2003 - 21:12 #24
Oki...
Avatar billede casualty Nybegynder
29. oktober 2003 - 21:24 #25
Hentet og insstalleret
Avatar billede casualty Nybegynder
29. oktober 2003 - 21:26 #26
Så skal jeg vel lave en "xxx.cpp" fil og kompilere den med "c++.exe xxx.cpp"
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:29 #27
Nej du starter med at lave en klasse med den native metode.

F.eks.:

package util;

public class UtilJNI {
    public native String getenv(String s);
    static {
        System.loadLibrary("utiljni");
    }
}
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:29 #28
Den compiler du og kører javah på.
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:30 #29
Og så implementerer du .c filen udfra .h filen (navnene er afskyelige)
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:30 #30
Min build.bat for mit test eksempel ser ud som:

@echo off
javac TestJNI.java
javah -classpath .. -jni test.TestJNI
gcc -c -I\sunjava\jdk1.3.1\include -I\sunjava\jdk1.3.1\include\win32 test_TestJNI.c -o test_TestJNI.obj
gcc -mdll -Wl,--base-file,base.tmp test_TestJNI.obj -o junk.tmp
dlltool --dllname testjni.dll --base-file base.tmp --output-exp exp.tmp --def TestJNI.def
gcc -Wl,--enable-stdcall-fixup -mdll -Wl,exp.tmp test_TestJNI.obj -o testjni.dll
del *.tmp
javac -classpath .. TestTestJNI.java
path=.;%PATH%
java -classpath .. test.TestTestJNI
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:31 #31
Du kan se hele eksemplet på:

http://www.vajhoej.dk/arne/code/jni/TEST/
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:32 #32
(jeg tror iøvrigt at build.bat kan laves nemmere for nye mingw versioner,
men jeg fik den strikket sammen for mange år siden og har ikke gidet
shine den op)
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:36 #33
Selve C koden må blive noget a la:

#include <string.h>
#include <stdlib.h>

#include <jni.h>

#include "util_UtilJNI.h"

static char retbuf[1000];

JNIEXPORT jstring JNICALL Java_util_UtilJNI_getenv(JNIEnv *cntx, jobject me, jstring s)
{
  const char *s2 = (*cntx)->GetStringUTFChars(cntx,s,0);
  strcpy(retbuf,getenv(s2));
  (*cntx)->ReleaseStringUTFChars(cntx,s,s2);
  return (*cntx)->NewStringUTF(cntx,retbuf);
}
Avatar billede casualty Nybegynder
29. oktober 2003 - 21:37 #34
Ok...Jeg kigger på det men vender nok først tilbage i morgen..
1000 tak for hjælpen
Avatar billede arne_v Ekspert
29. oktober 2003 - 21:44 #35
Helt fint.
Avatar billede casualty Nybegynder
03. november 2003 - 00:00 #36
Arne..Tak for hjælpen...Jeg har desværre lidt større byrder der trygger mig og min tid, så jeg har ikke lige kunne sætte tid af til at kunne kigge på det....Men det kommer vel :)

Btw, Jeg har noget du måske kan svare på : http://www.eksperten.dk/spm/422333

Læg lige et svar i denne tråd mhp. points...

Mvh Casualty
Avatar billede arne_v Ekspert
03. november 2003 - 05:44 #37
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester