Java-bindning

Moderator: Telldus

gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Java-bindning

Post by gein »

Okej, vi byter tråd :)

Finns det någon guide som beskriver hur jag installerar java-bindningar? Är bindningarna beroende av telldus-core?

Jag laddade ner http://developer.telldus.se/browser/tru ... ings/java/
Men nu vet jag inte riktigt hur jag går tillväga för att kompilera bindningarna (OS X)?
Last edited by gein on Sat Feb 13, 2010 2:59 pm, edited 1 time in total.
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Java-bindning

Post by hekj »

gein wrote:Finns det något guide som beskriver hur jag installerar java-bindningar? Är bindningarna beroende av telldus-core?

Jag laddade ner http://developer.telldus.se/browser/tru ... ings/java/
Men nu vet jag inte riktigt hur jag gör tillväga för att kompilera bindningarna (OS X)?
Ett annat alternativ är att använda sig av JNA:
JNA has been built and tested on OSX (ppc, x86, x86_64), linux (x86, amd64), FreeBSD/OpenBSD (x86, amd64), Solaris (x86, amd64, sparc, sparcv9) and Windows (x86, amd64). It has also been built for windows/mobile and Linux/ppc64, although those platforms are not included in the distribution. The ant build script's test target will build and run the test suite, which has decent coverage and is a quick way to determine if your environment is set up correctly.
http://www.telldus.se/forum/viewtopic.php?p=1147#1147

En sak som jag själv undrar är om TelldusCore.dll som jag använder mig av i windows fortfarande heter så i OSX och linux eller om den har ett annat namn :?:

/Henrik
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Windows: TelldusCore.dll
Linux: libtelldus-core.so.2
OS X: TelldusCore.framework

Innuti dessa är det precis samma funktioner som exporteras. Hur det länkas (om man gör det vid kompileringstillfället) skilljer sig lite åt från plattform till plattform.
Micke Prag
Software
Telldus Technologies
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Java-bindningen som jag skrev som du refererar till i början är skriven mot JNI.
Tyvärr kommer jag inte ihåg hur du kompilerar dessa.
Micke Prag
Software
Telldus Technologies
gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Post by gein »

micke.prag wrote:Windows: TelldusCore.dll
Linux: libtelldus-core.so.2
OS X: TelldusCore.framework

Innuti dessa är det precis samma funktioner som exporteras. Hur det länkas (om man gör det vid kompileringstillfället) skilljer sig lite åt från plattform till plattform.
Alright, tack! TelldusCore.framework, finns den färdigkompilerad att hämta hem? Om ja, vart hittar jag den?
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Den installerar sig i /Library/Frameworks när du installerar TelldusCenter
Micke Prag
Software
Telldus Technologies
gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Post by gein »

micke.prag wrote:Den installerar sig i /Library/Frameworks när du installerar TelldusCenter
Okej, då kvarstår dock frågan hur sjutton man får bindningen att kompilera.
tellstick.c:4:25: error: TellUsbD101.h: No such file or directory
Laddar jag hem TellUsbD101.h och refererar till den så får jag istället felet:
$ gcc -I/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Headers/ -I./ tellstick.c In file included from tellstick.c:4:
./TellUsbD101.h:24: error: expected identifier or ‘(’ before string constant
tellstick.c: In function ‘Java_tellstick_devTurnOn’:
tellstick.c:7: error: parameter name omitted
tellstick.c:7: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_devTurnOff’:
tellstick.c:14: error: parameter name omitted
tellstick.c:14: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_devBell’:
tellstick.c:21: error: parameter name omitted
tellstick.c:21: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_devDim’:
tellstick.c:28: error: parameter name omitted
tellstick.c:28: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_devMethods’:
tellstick.c:35: error: parameter name omitted
tellstick.c:35: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_devGetNumberOfDevices’:
tellstick.c:42: error: parameter name omitted
tellstick.c:42: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_devGetDeviceId’:
tellstick.c:49: error: parameter name omitted
tellstick.c:49: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_devGetName’:
tellstick.c:56: error: parameter name omitted
tellstick.c:58: warning: initialization makes pointer from integer without a cast
tellstick.c:59: error: request for member ‘NewStringUTF’ in something not a structure or union
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Ahh, verkar som dom bindningarna är skrivna mot version 1.x.
Dom måste uppgraderas att använda 2.0 med telldus-core.h iställer för TellUsbD101.h
De flesta funktionerna är snarlika fast med prefixet "td" istället för "dev".

När du länkar med gcc mot telldus-core görs det med -ltelldus-core i Linux men -framework TelldusCore under Mac OS X.

framework-växeln är trevlig då den även ger include-mappen till telldus-core.h har jag för mig.
Micke Prag
Software
Telldus Technologies
gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Post by gein »

micke.prag wrote:Ahh, verkar som dom bindningarna är skrivna mot version 1.x.
Dom måste uppgraderas att använda 2.0 med telldus-core.h iställer för TellUsbD101.h
De flesta funktionerna är snarlika fast med prefixet "td" istället för "dev".

När du länkar med gcc mot telldus-core görs det med -ltelldus-core i Linux men -framework TelldusCore under Mac OS X.

framework-växeln är trevlig då den även ger include-mappen till telldus-core.h har jag för mig.
Vi börjar kanske närma oss. Den där -framework flaggan blev jag inte klok på men lyckades till slut lista ut att man kan skriva
#include <TelldusCore/telldus-core.h>
i tellstick.c samt
#include <JavaVM/jni.h>
i tellstick.h så gick den direkt till de båda ramverken och hämtade header-filerna.

Jag lyckades dock inte fixa tellstick.c så att den matchar 2.0. Följande fel får jag:
$ gcc tellstick.c
tellstick.c: In function ‘Java_tellstick_tdTurnOn’:
tellstick.c:7: error: parameter name omitted
tellstick.c:7: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_tdTurnOff’:
tellstick.c:14: error: parameter name omitted
tellstick.c:14: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_tdBell’:
tellstick.c:21: error: parameter name omitted
tellstick.c:21: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_tdDim’:
tellstick.c:28: error: parameter name omitted
tellstick.c:28: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_tdMethods’:
tellstick.c:35: error: parameter name omitted
tellstick.c:35: error: parameter name omitted
tellstick.c:37: error: too few arguments to function ‘tdMethods’
tellstick.c: In function ‘Java_tellstick_tdGetNumberOftdices’:
tellstick.c:42: error: parameter name omitted
tellstick.c:42: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_tdGettdiceId’:
tellstick.c:49: error: parameter name omitted
tellstick.c:49: error: parameter name omitted
tellstick.c: In function ‘Java_tellstick_tdGetName’:
tellstick.c:56: error: parameter name omitted
tellstick.c:59: error: request for member ‘NewStringUTF’ in something not a structure or union
Här är en liten snippet ur den modifierad tellstick.c:

Code: Select all

JNIEXPORT jboolean JNICALL
Java_tellstick_tdTurnOn(JNIEnv *, jobject, jint inttdiceId)
{
        return (jboolean) tdTurnOn( (int)inttdiceId);
}
Tack för att du står ut med mina frågor, micke!
gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Post by gein »

Nu är det nära. Jag har moddat tellstick.c men har ett fel kvar som jag inte riktigt vet hur jag ska lösa ännu:
$ gcc tellstick.c
tellstick.c: In function ‘Java_tellstick_tdGetName’:
tellstick.c:59: error: request for member ‘NewStringUTF’ in something not a structure or union

Code: Select all

JNIEXPORT jstring JNICALL
Java_tellstick_tdGetName(JNIEnv *env, jobject obj, jint inttdiceId)
{
	const char *name = tdGetName( (int)inttdiceId );
	return env->NewStringUTF(name);
}
gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Post by gein »

Mera framsteg. Nu kompilerar det men jag får länk fel:
$ gcc -arch i386 -framework TelldusCore tellstick.c
Undefined symbols:
"_main", referenced from:
start in crt1.10.6.o
"_tdGettdiceId", referenced from:
_Java_tellstick_tdGettdiceId in ccGIbDf2.o
"_tdGetNumberOftdices", referenced from:
_Java_tellstick_tdGetNumberOftdices in ccGIbDf2.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Post by gein »

Och nu har jag bara ett länkfel kvar som jag inte förstår:
$ gcc -arch i386 -framework TelldusCore tellstick.c
Undefined symbols:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Vart uppstår det här?
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Vi börjar kanske närma oss. Den där -framework flaggan blev jag inte klok på men lyckades till slut lista ut att man kan skriva
Citat:
#include <TelldusCore/telldus-core.h>
Detta gör det tyvärr plattforms-beroende då det inte kommer kompilera i Linux eller Windows. Ett bättre sätt är att skicka det som -I till gcc. Men det är småsaker...

Det sista felet är troligtvis för att gcc vill kompilera koden som ett program och behöver då en main-funktion. Det finns en flagga som säger till gcc att kompilera det som ett bibliotek istället. Har tyvärr inte möjlighet att kolla upp hur där jag befinner mig nu.
Micke Prag
Software
Telldus Technologies
gein
Posts: 437
Joined: Fri Mar 17, 2023 9:45 am

Post by gein »

micke.prag wrote:
Vi börjar kanske närma oss. Den där -framework flaggan blev jag inte klok på men lyckades till slut lista ut att man kan skriva
Citat:
#include <TelldusCore/telldus-core.h>
Detta gör det tyvärr plattforms-beroende då det inte kommer kompilera i Linux eller Windows. Ett bättre sätt är att skicka det som -I till gcc. Men det är småsaker...

Det sista felet är troligtvis för att gcc vill kompilera koden som ett program och behöver då en main-funktion. Det finns en flagga som säger till gcc att kompilera det som ett bibliotek istället. Har tyvärr inte möjlighet att kolla upp hur där jag befinner mig nu.
Helt riktigt!
$ gcc -arch i386 -framework TelldusCore -dynamiclib tellstick.c -o tellstick.dylib
MacbookV2:java patrikjansson$ ls -alF
total 48
drwxr-xr-x 6 patrikjansson staff 204 13 Feb 17:30 ./
drwxr-xr-x 9 patrikjansson staff 306 13 Feb 11:14 ../
-rw-r--r--@ 1 patrikjansson staff 1379 13 Feb 17:22 tellstick.c
-rwxr-xr-x 1 patrikjansson staff 9180 13 Feb 17:30 tellstick.dylib*
-rw-r--r--@ 1 patrikjansson staff 1524 13 Feb 16:42 tellstick.h
-rw-r--r--@ 1 patrikjansson staff 676 13 Feb 11:15 tellstick.java
:D
Tack för hjälpen! Nu återstår bara att se hur den här verkligen fungerar. Sen ser jag ju också att telldus-core.h innehåller en hel del funktioner som inte min JNI-bindning använder sig av. Men den är väl lite föråldrad helt enkelt?
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Ja, föråldrad är den och sedan finns det funktioner som inte är intressanta i "vanliga" applikationer utan endast används av TelldusCenter för att konfigurera enheter.

Om du får igång denna wrapper får du gärna skicka dina ändringar till oss så att fler kan dra nytta av dom. Jag tror att funktionerna som returnerar strängar (t.ex. tdGetName()) kan behövas fixas på ett annorlunda vis för att inte läcka minne med. Det kan jag kolla på sedan.
Micke Prag
Software
Telldus Technologies
Post Reply