Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu?

Hallo zusammen!

Praktisch überall im Internet wird man auf ein Verzeichnis namens „libs“ verwiesen, welches aber so in dieser Form bei meinem Projekt gar nicht existiert.

Beispiel hier:

Oder hier:

Oder müsste ich dieses selbst erstellen?

1.) Es läuft letztendlich auf das gleiche Hinaus wie das hier bei Eclipse:

2.) Der Inhalt der .jar-Datei sollte beim Builden ins .apk kopiert werden, damit diese Libraries letztendlich dann auch dort drin sind.

Evtl. weiss hier jemand was zum Thema? Vielen Dank für die Feedbacks! :slight_smile:

Das Thema wurde zwar schon im alten „Java-Forum“ durchgekaut und es wurde keine Lösungen für ein eigentlich äusserst triviales Problem gefunden. All das was im Netz steht funktioniert nicht im Geringsten.

…also habe ich halt ne GitHub-Issue bei gradle eröffnet - quasi aus Resignation:

Evtl. weiss aber jemand hier, was nun wirklich was Problem ist…?

Besten Dank… :slight_smile:

Bei Java Build Path > Libraries warst du schon richtig! Jetzt muss nur noch das „Pendant“ dazu in Android Studio gefunden werden… Ich bezweifle aber etwas, dass eine .jar einfach händisch in einen Ordner kopiert/verschoben werden kann und dass das das AS „mitbekommt“. Vielleicht geht’s auch einfach mit DnD ins AS - wenn nicht dann über die Einstellungen.

"Vielleicht geht’s auch einfach mit DnD ins AS - wenn nicht dann über die Einstellungen."

Kenne das zwar nicht werde es aber mal googeln und versuchen abzuklären.

Ja, das kann ja kaum sein dass das nicht funktioniert und ein Bug ist… das wäre doch schon längt jemandem aufgefallen!

(Und mir „normalem“ Java oder J2EE und Eclipse hatte ich damals ja auch ein paar Startschwierigkeiten, welche oft nicht die Sprache / Sprachsyntax oder irgendwelche Programmlogik betrafen…)

Habe es dem Chef mal so mitgeteilt dass es dafür ne Lösung geben muss, der hat wieder Stress gemacht - deshalb meine „Kurzschlussreaktion“ mit dem Bug bei GitHub…

Vielen Dank!! :+1: :+1: :+1:

Es ging doch nicht darum, OB es geht (denn dass es geht nehme ich einfach an), sondern WIE es geht…
Obwohl, wenn ich länger darüber nachdenke, müssen die Abhängigkeiten ja auch iwie in den PlayStore…
Btw. DnD steht für drag and drop.

Nein, in den PlayStore muss es nicht. Es ist eine interne geschäftliche Anwendung.

Aber wie ist das jetzt zu verstehen? Kann ich das .apk, welches bereits die Abhängigkeiten beinhaltet (quasi fat-JAR) nicht „einfach so“ in den PlayStore? (Wie ich weiss verifiziert Google die Apps ob diese „konform“ sind, aber das mit den Abhängikeiten was mir bis jetzt nicht vertraut…)

Klingt fast nicht so:

https://developer.android.com/guide/app-bundle/dynamic-delivery

Leider bin ich mit meinem Latein nu auch am Ende…

OK, danke. :open_mouth:

Also ich würde empfehlen, bevor ich eine App schreibe, mich mit den Grundlagen zu beschäftgen. Ich habe das Gefühl, dass man hier versucht - von heute auf morgen eine APP zu bauen :wink:

Zu der Frage: 빌드 종속 항목 추가  |  Android 개발자  |  Android Developers

Die Abhängeiten werden mit gradle gepflegt. Manuell etwas hinzuzufügen ist nicht möglich und vor allem nicht nötig.

Vielen Dank für den Link!

"Ich habe das Gefühl, dass man hier versucht - von heute auf morgen eine APP zu bauen :wink:"

Das hast du (leider) ganz richtig erkannt. Schliesslich sind „wir“ (bei uns in der Firma) ja Programmierer - und „Programmierer“ können programmieren. Und zwar alles und noch viel mehr!! Punkt Schluss!!!

Manchmal muss man die Sache halt eben mit etwas Humor sehen… :wink:

"Die Abhängeiten werden mit gradle gepflegt. Manuell etwas hinzuzufügen ist nicht möglich und vor allem nicht nötig."

Ist aber ne selbst entwickelte Library, und deswegen in keinem öffentlichen Repo verfügbar.

"Obwohl, wenn ich länger darüber nachdenke, müssen die Abhängigkeiten ja auch iwie in den PlayStore…"

Irgendwo habe ich ja mal ursprünglich erfahrnen, dass die Apache HTTP Client Library nicht kompatibel sei, habe gedacht dies sei evtl. weil das Android-JRE intern anders läuft…? Und nicht weil ich dann irgendwie (?) dafür sorgen muss dass die Abhängiekeiten wie auch immer in den App Store gelangen.

Deshalb habe ich, basierende auf irgendwelchen java.net.xxx-Klassen und Streams selbst nen HTTP-Client programmiert. Dabei habe ich die Hoffnung, dass die Klassen, welche ich dabei verwendet habe, ebenfalls im JRE von Android sind. (?)

Hmmm… mal weiterschauen, aber vielleicht weiss ja sonst noch jemand was zum Thema.

P.S.: Und auch ich habe ein wenig „Dampf abgelassen“ wie marco13 unter Frust-Thread - #1114 von Marco13, und zwar im alten Java-Forum:

"…muss wohl wieder zurück in die J2EE-Welt, popelige Smartphone-Apps zu entwickeln ist wohl nix für „kernige Hacker“ mittleren Alters! :wink: (Eher was für junge Hipster-Informatiker, denen das neuste Smartphone wichtiger als ein richtiger Computer/PC ist…:wink: LOL…:rofl:)"

Hehe… :imp:

Hallo, das ist eigentlich ganz einfach:
File -> Project Structure -> Dependecies -> [Das Modul]
Dann unter „Declared Dependencies“ ist ein kleines „+“ und dann auf „Jar Dependency“
Fertig.

Das Project Structure Menü ist relativ wichtig, ist gut sich das im Hinterkopf zu behalten.

Grüße.

Vielen Dank, werde mal schauen und mich anschliessend, so oder so, melden.

Nun bin ich seit ca. Anfang Woche an dieser Stelle hängengeblieben, natürlich war ich nicht 3 x 8.6h permanent an diesem Thema. Aber es hat wieder mal alles ein „wenig“ (na ja, man ist es sich ja mittlerweile gewohnt ;-)) hinausgezögert - keine Frage.

Leider sehe ich keine „Declared Dependencies“, nur „All Dependencies“:

…und dort habe ich mit dem Klick auf das +-Zeichen den Eintrag „Jar Dependancy“ gewählt und dann die (zuvor manuell in das libs-Verzeichnis hinzugefügte) „AndroidCompatibleHTTPClient.jar“ ausgewählt. Dann auf OK geklickt und für den sync-Vorgang „Try Again“ gewählt.

Resultat:

Caused by: org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method implementation() for arguments [directory 'libs'] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

build.gradle, alles vorherige auskommentiert bis auf implementation … xxx. jar … :

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        implementation fileTree(dir: 'libs', include: ['AndroidCompatibleHTTPClient.jar'])
        //compile fileTree(dir: 'libs', include: ['AndroidCompatibleHTTPClient.jar'])
        //classpath fileTree(dir: 'libs', include: ['AndroidCompatibleHTTPClient.jar'])

        //implementation fileTree(dir: 'libs', include: ['*.jar'])
        //compile fileTree(dir: 'libs', include: ['*.jar'])
        //classpath fileTree(dir: 'libs', include: ['*.jar'])
    }
}



allprojects {
    repositories {
        google()
        jcenter()
    }
}



task clean(type: Delete) {
    delete rootProject.buildDir
}

Meldung wie bereits gehabt:

Caused by: org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method implementation() for arguments [directory 'libs'] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

*** kotz!! ***, *** würg!! ***

Wieso stellst du deine Frage eigentlich in zwei Foren? Du weißt schon, dass „crosspostings“ ungern gesehen sind oder?

Unterschiedliche Meinungen einholen und damit das Ganze evtl. ein wenig beschleunigen. Ja, ich weiss dass „crosspostings“ eher ungern gesehen sind.

Aber warum eigentlich? (Klar, byte-welt sowie das java-forum mögen einander grundsätzlich nicht besonders, warum ist mir soweit bekannt…)

Soll aber keinesfalls darauf hinauslaufen: „Ihr hier seit nicht gut genug und deshalb frage ich noch woanders“ (resp. umgekehrt!)

Aber wenn es so verstanden wurde, dann entschuldige ich mich dafür!

Im gleichen Forum in 2 unterschiedlichen Sektionen auf die gleiche Thematik hinaus gehen zu wollen, das ist klar. Geht gar nicht. Gibt ja auch Leute welche solche Sachen machen…

Oh…!!

Problem gefunden: .gradle-Dateien gibt es ja mehrfach!!! (Schon wieder vergessen) Im Projekt- sowie im app-Ordner!!

Nun war der. jar-Eintrag am falschen Ort und musste gar nicht von Hand gemacht werden sondern übers Menü…

Dann geht auch automatisch das hier in die .gradle-Datei im Verzeichnis app rein:

implementation files('libs\\AndroidCompatibleHTTPClient.jar')

Vielen Dank nochmal euch allen!! :slight_smile:

1 „Gefällt mir“

Nachtrag: Klappt auch, meine eigenen Klassen sowie deren Packages können problemlos aufgelöst werden im Android Studio-Projekt…

Hoffe jetzt mal dass mein selbst programmierter HTTP-Client (aktuell nur GET und HTTPS ist auch noch pendent), welcher auf Socket, irgendwelchen Implementierungen von Input- sowie OutputStream wie auch StringWriter (der übergibt am Ende der Funktion die Reponse als String) funktioniert.

Und das selbst im App-Store. (Ganz allgemein - jedoch nicht für das aktuelle Projekt! Das kommt never ever in den App Store rein! ;-))

Ich meine das sollte aufgrund der verwendeten Java-Standard-Klassen (java.io und so) doch hoffentlich klappen…(?)

Mal schauen beim einem anderen Projekt, welches dann ggf. in den App Store gelangt.

Nochmal besten Dank, langsam komme ich der Android-Sache näher. Schritt für Schritt, Tag für Tag…

Hallo zusammen

Leider nix geht mit meinem selbst gebastelten HTTP-Client, auf dem PC läuft er wunderbar, wobei er folgende Java-Klassen verwendet. Ich meine die sind absolut grundlegend und sollten auch auch auf Android verfügbar laufen. (?)

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.net.Socket;
import java.util.function.Consumer;

Nun, des Weiteren:

  • Die App kommt, natürlich wie bereits oben erwähnt, nicht vom App-Store… Sondern wird über Remote-Debugging direkt vom Android Studio aufs Gerät installiert.

  • Der Windows-Rechner wo ich die App entwickle (welche einen HTTP-Zugriff erfordert!) hat in der Firewall den Port 80 für den Apache (als Test-Service) freigegeben.

  • Ich bin mit dem Smartphone im gleichen WLAN, wo der Test-/Entwicklungs-Apache (wie oben beschrieben) ist, also auf 192.168.80.120. Wenn ich auf dem Smartphone den Browser starte, dann bekomme ich ja eine Antwort. Grundsätzlich besteht also kein Problem dass

a.) der Port 80 auf dem Win-Rechner nicht in der Firewall eingetragen ist.

ODER

b.) Ich mit dem Smartphone gar im falschen Subnetz bin

  • Einträge in der Art in die Datei "AndroidManifest.xml" habe ich ebenfalls gemacht, allerdings werde ich nicht danach gefragt ob ich der App nun Zugriff aufs Internet (android.permission.INTERNET) oder sonst was (android.permission.ACCESS_NETWORK_STATE, ???) oder auf’s lokale WLAN-Subnetz (android.permission.ACCESS_WIFI_STATE) gewähren will:
<!-- J.M., 2020-05-26 { -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- } J.M., 2020-05-25 -->

…und in der App hab ich natürlich 192.168.80.120 hard-codiert eingetragen, ich habe also nicht vergessen das anzupassen!! :wink: In der JUnit-Test-App in Eclipse wo ich die HTTP-Client-Library entwickelt habe, stand vorher localhost drin… daran liegt es also auch nicht.

Im Prinzip ganz einfacher, trivialer Mist, welcher auf Anhieb funktionieren müsste. Tut er aber nicht. Und ich sehe momentan keinen einzigen logischen Grund warum er das nicht tut!!

Vielleicht weiss hier gerade jemand was zum Thema?

Sonst kann ich auch nen neuen Thread eröffnen zu dieser äusserst leidigen Problematik…

Vielen Dank.