Как импортировать .dll в Java-проект Android (работа с eclipse) - PullRequest
5 голосов
/ 06 мая 2011

Собственный интерфейс Java (JNI)

Собственный интерфейс Java (JNI) является одним из интересных интерфейсов Java. с использованием JavaСобственный интерфейс (JNI), с которым вы можете работать с другими приложениями и библиотеками .

JNI - это собственный программный интерфейс для Java, являющийся частью JDK.Используя JNI, вы можете работать с другими приложениями и библиотеками, написанными на другом языке, например C, C ++.Но возникает основной вопрос, когда мне следует использовать JNI?

  1. Вам нужна некоторая информация, специфичная для платформы, и стандартная библиотека классов Java может не поддерживать зависящие от платформы функции, необходимые для вашего приложения.
  2. У вас есть библиотечное приложение, написанное на другом языке, и вы хотите использовать его в своем Java-приложении.
  3. Вы хотите, чтобы Java взаимодействовала с некоторымиязык программирования низкого уровня.

Ниже приведен простой пример;Обратите внимание, что методы имеют «родной» KeyWord:

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

DLL, которую мы собираемся использовать, - firstJNI.DLL. Эта DLL может быть сгенерирована с помощью VC ++ или borland.О чем мы поговорим позже.

//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); 
     }
}

Скомпилируйте приведенный выше код, используя (Что это значит?)

prompt>javac firstJNI.java

Затем создайте заголовочный файл, используя (Что это значит?)

prompt>javah javah -jni HelloWorld

Будет создан первый файл JNI.h.В заголовочном файле вы увидите

-------------------------------------
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);
----------------------------------------------

Не редактировать заголовочный файл

Теперь давайте посмотрим, как сгенерировать DLL с помощью VC ++. Нажмите: File-> New-> Win32Dynamic.-Link Library Дайте имя и выберите простой проект DLL. У вас будет файл firstJNI.CPP. Ниже приводится файл 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);

}

Теперь у меня есть вопросы о том, как я могу использоватьФайл .dll, написанный на C ++ / C в моем приложении Java.Я разрабатываю приложение для Android с использованием Eclipse, и у меня есть несколько DLL-файлов, и у меня нет их источника ... Как я могу использовать их в своем проекте ???

Ответы [ 4 ]

3 голосов
/ 06 мая 2011

Сначала отказ от ответственности - я немного отрывочен в этом вопросе, уже давно я использую JNI.

Многие примеры JNI предполагают, что у вас есть код для библиотеки, которую вы хотите вызвать, чтопо моему опыту редко бывает.В примере, который вы видите, утилита javah использовалась для генерации файла заголовка, для которого была написана реализация cpp - вот почему вы можете увидеть файл заголовка jni и различные ключевые слова Java в файле cpp.

Чтобы использовать сторонний dll, вам сначала нужна документация для этого dll, без чего вы мертвы в воде.Причина, по которой вам нужна документация, заключается в том, что вы собираетесь предоставить dll-оболочку, которая просто делегирует сторонним dll - вам нужно знать, как ее вызывать и как выполнять сопоставления любых типов.Очевидно, что именно эта оболочка будет содержать весь JNI-контент, позволяющий Java вызывать эту оболочку, которая, в свою очередь, вызывает стороннюю библиотеку DLL.

Есть разные способы сделать это, но самый простой способ, который я знаю, этоиспользовать SWIG , который сгенерирует весь код C ++, необходимый для оболочки DLL.Также полезно иметь кого-то, кто знает C ++, под рукой - они будут иметь неоценимое значение для написания файлов интерфейса (.i или .swg), которые SWIG использует для генерации кода оболочки.

1 голос
/ 06 мая 2011

Я не думаю, что вы сможете использовать встроенную библиотеку Windows (.dll) в приложении для Android.Для загрузки на Android код должен быть встроен в .so.

1 голос
/ 06 мая 2011

Я не эксперт по этим вопросам, но я думаю, что вы должны использовать System.loadLibrary("comparejni"); http://blog.jayway.com/2010/01/25/boosting-android-performance-using-jni/

Надеюсь, это помогло

0 голосов
/ 06 мая 2011

Эта статья для простой Java, а не для Android:

Вызов DLL из Java

Вызов DLL C / C ++ из Java

Введение

В этом пошаговом руководстве мы покажем, как код C / C ++, скомпилированный в DLL-библиотеку Windows, можно вызывать из Java с помощью J / Invoke.

Мы будем использовать Microsoft Visual Studio 2005 для создания DLL с функциями C ++ и писать код Java с помощью Eclipse Java IDE. Шаги для других IDE будут аналогичными. Мы рекомендуем вам «пройтись» с нами по этому упражнению, даже если вы не очень хорошо знакомы с Visual Studio или Eclipse - это легко и весело!

Для запуска этого примера вы должны использовать Windows 2000, XP, Vista или 2003.

J / Invoke требуется комплект разработчика Java SE. Поскольку он использует аннотации Java, необходим JDK версии 5.0 или выше. Получить Java здесь.

Продолжить чтение ...

...