2011-05-06 19 views
5

Java Native Interface (JNI)Jak importować dll do projektu Android Java (pracuje z zaćmienia)

Java Native Interface (JNI) jest jednym z intersting interfejsu przez Java od wykorzystaniem Java Native Interface (JNI) możesz pracować z innymi aplikacjami i bibliotekami.

JNI to macierzysty interfejs programowania dla języka Java, który jest częścią pakietu JDK. Używając JNI możesz operować z innymi aplikacjami i bibliotekami napisanymi w innych językach, takich jak C, C++. Ale podstawowe pytanie pojawia się, kiedy powinienem używać JNI?

  1. Chcesz jakiś specyficzny platformą informacyjną i średnia klasa biblioteki Java może nie obsługiwać funkcje zależne od platformy potrzebnych aplikacji.
  2. Masz pewną aplikację biblioteczną napisaną w innym języku i chcesz jej użyć w aplikacji java.
  3. Chcesz, aby Java współpracowała z jakimś niskim poziomem programowania.

Poniżej przedstawiono prosty przykład; Zobacz, że metody mają „native” Słowo kluczowe:

public native void displayHelloWorld(); 
public native void displayOther(); 
private native String getLine(String prompt); 

DLL będziemy używać jest firstJNI.DLL Ten DLL mogą być generowane przez VC++ czy Borland. Które omówimy później.

//firstJNI.java 

class firstJNI 
{ 
    public native void displayHelloWorld(); 
    public native void displayOther(); 
    private native String getLine(String prompt); 

    static { 
    System.loadLibrary("firstJNI");//This is firstJNI.DLL 
    /*if generated by borland 
    System.loadLibrary("firstjni");//This is firstjni.dll 
    */ 
    } 

    public static void main(String[] args) 
    { 
     firstJNI JN=new firstJNI(); 
     JN.displayHelloWorld(); 
     JN.displayOther(); 
         
     String input = JN.getLine("Enter Some Thing "); 
     System.out.println("You Entered " + input); 
    } 
} 

Kompilacja powyższy kod korzystając (Co to znaczy?)

prompt>javac firstJNI.java 

Następnie należy utworzyć nagłówek pliku przy użyciu (Co to znaczy?)

prompt>javah javah -jni HelloWorld 

ten utworzy plik firstJNI.h. W pliku nagłówkowym widać

------------------------------------- 
JNIEXPORT void JNICALL Java_firstJNI_displayHelloWorld 
(JNIEnv *, jobject); 

/* 
* Class:  firstJNI 
* Method: displayOther 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_firstJNI_displayOther 
    (JNIEnv *, jobject); 

/* 
* Class:  firstJNI 
* Method: getLine 
* Signature: (Ljava/lang/String;)Ljava/lang/String; 
*/ 
JNIEXPORT jstring JNICALL Java_firstJNI_getLine 
    (JNIEnv *, jobject, jstring); 
---------------------------------------------- 

Nie edytować nagłówek pliku

Teraz patrz jak generować DLL przy użyciu VC++, kliknij: File-> New-> Win32Dynamic-Link Library Give nazwę i wybierz prosty projekt DLL Trzeba będzie firstJNI.CPP złożyć Poniżej znajduje się dany plik firstJNI.cpp

// MYVCDLL.cpp : Defines the entry point for the DLL application. 
// 

#include "stdafx.h" 
#include "D:\Kanad\Study\codeToad Articles\firstJNI.h" 
#include "jni.h" //can copy or give full path 
#include <math.h> 

BOOL APIENTRY DllMain(HANDLE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
                    ) 
{ 
    return TRUE; 
} 

extern "C" __declspec(dllexport) int getMemorySize(); 
//And your function definition should look like this: 
extern "C" __declspec(dllexport) int getMemorySize() 
{  //do something 

MEMORYSTATUS memoryStatus; 
int MB=1024*1024 ; 
double memSize; 
memoryStatus.dwLength=sizeof(MEMORYSTATUS); 

GlobalMemoryStatus(&memoryStatus); 

__int64 size= memoryStatus.dwTotalPhys; 

memSize=(double)size/MB; 

printf("\nTotal Memory %.0lf MB",ceil(memSize)); 

return 0; 
} 

JNIEXPORT void JNICALL 
Java_firstJNI_displayHelloWorld(JNIEnv *env, jobject obj) 
{ 
    printf("Hello world! This is using VC++ DLL\n"); 

} 

JNIEXPORT void JNICALL 
Java_firstJNI_displayOther(JNIEnv *env, jobject obj) 
{ 
     
    printf("Hello world! This is using VC++ DLL Other Function \n"); 
    getMemorySize(); 
     
} 

JNIEXPORT jstring JNICALL 
Java_firstJNI_getLine(JNIEnv *env, jobject obj, jstring enter) 
{ 

    char buf[128]; 
    const char *str = env->GetStringUTFChars(enter, 0); 
    printf("\n%s", str); 
    env->ReleaseStringUTFChars(enter, str); 
    scanf("%s", buf); 
    return env->NewStringUTF(buf); 

} 

Mam teraz pytania dotyczące sposobu użycia pliku .dll napisanego w C++/C w mojej aplikacji java. Zajmuję się tworzeniem aplikacji dla Androida za pomocą Eclipse i mam pewne pliki DLL, a ja nie mają ich źródła ... Jak mogę używać ich w moim projekcie?

+0

Więc udało się dodać dll w swoim rodzimym Android projektu? Trochę utknąłem w tym, spójrz tutaj http: // stackoverflow.com/questions/28393305/using-dll-library-in-android-application –

Odpowiedz

3

Najpierw disclaimer - Jestem trochę szkicowy na to, że już trochę czasu odkąd użyłem JNI.

Wiele przykładów JNI zakłada, że ​​posiadasz kod biblioteki, do której chcesz zadzwonić, co rzadko mi się zdarza. W przykładzie, który zobaczyłeś, użyto javah util do wygenerowania pliku nagłówkowego, przeciwko któremu napisano implementację cpp - dlatego możesz zobaczyć plik nagłówkowy jni i różne słowa kluczowe Java w pliku cpp.

Aby skorzystać z biblioteki dll innej firmy, najpierw potrzebujesz dokumentacji dla tej biblioteki, bez tego, że jesteś martwy w wodzie. Powodem, dla którego potrzebna jest dokumentacja jest to, że dostarczysz opakowanie DLL, które po prostu przekazuje do biblioteki dll innej firmy - musisz wiedzieć, jak to nazwać i jak wykonać mapowania dowolnego typu. Oczywiście to jest to opakowanie, które będzie zawierało wszystkie elementy JNI, aby umożliwić Java wywołanie tego opakowania, które z kolei wywołuje bibliotekę 3rd party.

Jest na to wiele sposobów, ale najłatwiejszy sposób, jaki znam, to użycie SWIG, który wygeneruje cały kod C++ wymagany dla biblioteki otoki. Pomaga także mieć kogoś, kto zna C++ pod ręką - będą to bezcenne pliki interfejsu do pisania (pliki .i lub .swg), których SWIG używa do generowania kodu opakowania.

1

Nie sądzę, że będziesz w stanie korzystać z biblioteki rodzimej Windows (.dll) w aplikacji na Androida. Aby załadować na Androida, kod musiałby zostać wbudowany w .so.

+0

To prawda, kod C++ został skompilowany dla platformy docelowej, zwykle tworząc plik DLL w systemie Windows lub plik taki w systemie Unix. –

+0

OK pozwala powiedzieć, że mam .so bibliotekę, którą skompilowałem w Linuksie i mam jej dokumentację lub źródło kodu. Co muszę zrobić, aby zaimplementować go w czasie zaćmienia? –

0

ten artykuł jest dla Proste Java nie dla Androida:

Calling DLLs from Java

Calling C/C++ DLLs from Java

Wprowadzenie

W tym poradniku pokażemy jak C/C++ kod skompilowany do biblioteki DLL systemu Windows może być wywołany z Jav użycie J/Invoke.

Będziemy używać Microsoft Visual Studio 2005 do tworzenia biblioteki DLL z funkcjami C++ i pisania kodu Java za pomocą środowiska Java IDE Eclipse. Czynności dla innych IDE będą podobne. Zachęcamy do "przejścia" tego ćwiczenia z nami, nawet jeśli nie jesteś bardzo zaznajomiony z Visual Studio lub Eclipse - jest to łatwe i przyjemne!

Aby uruchomić ten przykład, powinien być uruchomiony w systemie Windows 2000, XP, Vista lub 2003.

J/Invoke wymaga zestawu dla programistów Java SE. Ponieważ używa adnotacji Java, wymagana jest wersja JDK 5.0 lub nowsza. Pobierz Javę tutaj.

Continue Reading ...

+1

te linki nie przekierowują tam gdzie chcesz – gismo

Powiązane problemy