Wie zu importieren .dll Android-java-Projekt (mit eclipse)
Java Native Interface (JNI) ist eine der
die interessante Schnittstelle von java Durch
Verwendung von Java Native Interface (JNI) Sie
kann die Zusammenarbeit mit anderen Anwendungen
und Bibliotheken.
JNI ist die native Programmierschnittstelle für java, die Teil des JDK. Mit JNI können Sie arbeiten mit anderen Anwendungen und Bibliotheken in einer anderen Sprache wie z.B. C,C++. Aber die grundsätzliche Frage Wann sollte ich das JNI ?
- Sie möchten, dass einige Plattform-spezifische Informationen und die standard-Java-Klassenbibliothek unterstützt möglicherweise nicht die Plattform-abhängigen Funktionen von Ihrer Anwendung benötigt werden.
- Sie haben einige library-Anwendung in einer anderen Sprache ist und Sie es verwenden möchten, in Ihre java-Anwendung.
- Sie wollen Java sollte die Interaktion mit einigen low-level-Programmiersprache.
Unten gegebenen Einfachen Beispiel; Sehen, dass Methoden haben 'native' Schlüsselwort:
public native void displayHelloWorld();
public native void displayOther();
private native String getLine(String prompt);
Die DLL, die wir verwenden werden ist firstJNI.DLL Diese DLL erzeugt werden kann VC++ oder borland. Die werden wir später besprechen.
//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);
}
}
Kompilieren Sie den obigen code mit (Was bedeutet das ?)
prompt>javac firstJNI.java
Dann erstellen header-Datei mit (Was bedeutet das ?)
prompt>javah javah -jni HelloWorld
Dadurch wird firstJNI.h-Datei. In der header-Datei, Sie werden sehen,
-------------------------------------
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);
----------------------------------------------
Nicht Bearbeiten header-Datei
Nun lassen Sie uns sehen, wie generate-DLL mit VC++, Klicken Sie auf: Datei->New->Win32Dynamic-Link Bibliothek
Geben Sie Namen und Wählen Sie
Ein einfaches DLL-Projekt
Sie haben
firstJNI.CPP Datei
Unten ist angesichts der firstJNI.cpp Datei
//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);
}
Jetzt habe ich Fragen über wie kann ich .dll-Datei, geschrieben in C++/C in meine java-Anwendung. Ich bin die Entwicklung von Anwendungen für android mit Eclipse und ich habe einige dll-Dateien, und ich habe nicht deren Quelle ... Wie kann ich Sie in meinem Projekt ???
InformationsquelleAutor Viktor Apoyan | 2011-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst ein disclaimer - ich bin ein wenig lückenhaft auf diesem, es ist schon eine Weile her, seit ich verwendet habe JNI.
Viele JNI-Beispiele angenommen, Sie eigenen code für die Bibliothek, die Sie anrufen möchten, die nach meiner Erfahrung nur selten der Fall. Im Beispiel ist die Sicht der javah util verwendet wurde, zum erzeugen einer header-Datei, gegen die cpp-Implementierung geschrieben wurde - das ist, warum Sie sehen können, die jni-header-Datei und verschiedene Java-Schlüsselwörter, die in der cpp-Datei.
Um ein 3rd-party-dll, müssen Sie zuerst die Dokumentation, die dll, ohne, dass man tot im Wasser. Der Grund, warum Sie benötigen, die Dokumentation ist, dass Sie gehen, um eine wrapper-dll, die einfach nur die Delegierten der 3rd-party-dll - Sie müssen wissen, wie Sie es nennen und wie Sie zur Durchführung jeder Art-Zuordnungen. Offensichtlich ist dieser wrapper enthält alle JNI Sachen zu erlauben, Java für den Aufruf dieser wrapper, die wiederum ruft die 3rd-party-dll.
Gibt es verschiedene Möglichkeiten, dies zu tun, aber der einfachste Weg, den ich kenne, ist die Verwendung SCHLUCK, um alle C++ - code benötigt, für die wrapper-dll. Es hilft auch, jemanden zu haben, der weiß, dass C++ auf der hand - Sie werden von unschätzbarem Wert sein schreiben von interface-Dateien (.ich oder .swg-Dateien), SWIG-verwendet zum generieren der wrapper-code.
InformationsquelleAutor Nick Holt
Ich bin kein Experte für dies, aber ich glaube, Sie sollten
System.loadLibrary("comparejni");
http://blog.jayway.com/2010/01/25/boosting-android-performance-using-jni/
Hoffe, es half
InformationsquelleAutor PedroAGSantos
Ich glaube nicht, dass du wirst in der Lage sein, die Verwendung einer nativen Windows-Bibliothek (.dll) in einem Android-Anwendung. Zu laden, auf Android, würde der code gebaut werden müssen in eine .so.
OK sagen wir, ich habe .so-Bibliothek, die ich zusammengestellt haben, in linux und ich habe es Dokumentation oder source code. Was muss ich tun, um die Implementierung in eclipse ?
InformationsquelleAutor sudocode
Dieser Artikel ist für Einfache Java nicht, für Android:
DLLs aufrufen von Java
Aufruf von C/C++ - DLLs aus Java
Einführung
In dieser exemplarischen Vorgehensweise werden wir Ihnen zeigen, wie C/C++ - code kompiliert in einer DLL von Windows aufgerufen werden kann, Java (J/Invoke.
Werden wir mithilfe von Microsoft Visual Studio 2005 zum erstellen einer DLL mit C++ - Funktionen und das schreiben von Java-code mit Hilfe des Eclipse-Java-IDE. Die Schritte für die anderen IDEs ähnlich sein wird. Wir ermutigen Sie dazu, "walk-through" - diese übung mit uns, auch wenn Sie nicht sehr vertraut mit Visual Studio oder Eclipse - es ist einfach, und es macht Spaß!
Um dieses Beispiel ausführen, sollten Sie unter Windows 2000, XP, Vista oder 2003.
J/Invoke erfordert einen Java SE developer kit. Wie es verwendet Java-Annotationen, JDK version 5.0 oder höher notwendig. Holen Sie sich Java hier.
Lesen Sie Weiter ...
InformationsquelleAutor Viktor Apoyan