2011-05-06 39 views
5

Java Native Interface (JNI)如何導入.dll文件到Android的Java項目(使用Eclipse工作)

Java本地接口(JNI)是由 Java中的野趣接口一個通過 使用Java Native Interface(JNI )您可以使用 和其他應用程序 和庫

JNI是Java的本地編程接口,它是JDK的一部分。使用JNI,您可以使用其他語言(如C,C++)編寫的其他應用程序和庫進行操作。但是基本問題出現在什麼時候應該使用JNI?

  1. 您需要一些特定於平臺的信息,標準Java類庫可能不支持應用程序所需的平臺相關功能。
  2. 您有一些使用其他語言編寫的庫應用程序,並且您想在您的Java應用程序中使用它。
  3. 您希望Java應該與一些低級編程語言交互。

以下給出簡單的例子;請參閱方法有「本土」關鍵字:

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

我們將要使用的DLL是可以通過VC生成firstJNI.DLL這個DLL ++或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 

這個頭文件將創建firstJNI.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); 
---------------------------------------------- 

不要編輯頭文件

現在,讓我們看看如何使用VC++生成的DLL,請點擊:文件 - >新建 - > Win32Dynamic鏈接庫 給名稱並選擇 一個簡單的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); 

} 

現在我對如何在我的Java應用程序中使用用C++/C編寫的.dll文件有疑問。我正在開發Android應用程序使用Eclipse,我有一些DLL文件,我沒有他們的來源...我怎樣才能在我的項目中使用它們?

+0

所以,你設法Dll文件添加到您的原生Android項目?我有點卡住,看看這裏http:// stackoverflow。com/questions/28393305/using-dll-library-in-android-application – 2015-02-08 14:25:02

回答

3

首先免責聲明 - 我對這個有點粗略,它已經有一段時間因爲我已經使用JNI。

許多JNI示例假定您擁有您要調用的庫的代碼,根據我的經驗,這種情況很少出現。在你看到的例子中,javah util已經被用來生成一個頭文件,cpp實現已經被寫入 - 這就是爲什麼你可以在cpp文件中看到jni頭文件和各種Java關鍵字的原因。

爲了使用第三方DLL,你首先需要該DLL的文檔,而不是你死在水中。你需要這個文檔的原因是你要提供一個簡單的委託給第三方DLL的包裝器DLL - 你需要知道如何調用它以及如何執行任何類型的映射。很顯然,這個包裝器將包含所有的JNI東西,以允許Java調用該包裝器,而該包裝器又調用第三方dll。

有很多種方法可以做到這一點,但我知道的最簡單的方法是使用SWIG,它將生成包裝DLL所需的所有C++代碼。這也有助於讓一個熟悉C++的人 - 他們將非常寶貴的編寫SWIG用來生成包裝代碼的接口文件(.i或.swg文件)。

1

我不認爲你將能夠在Android應用程序中使用Windows本機庫(.dll)。要在Android上加載,代碼需要內置到.so中。

+0

沒錯,必須爲目標平臺編譯C++代碼,通常在Windows上生成dll文件或在Unix上生成這樣的文件。 – 2011-05-06 09:40:10

+0

確定可以說我有.so庫,我已經編譯在Linux中,我有它的文檔或代碼源。我必須做什麼才能在eclipse中實現它? – 2011-05-06 09:52:16

0

這篇文章是爲簡單的Java不爲Android:

Calling DLLs from Java

Calling C/C++ DLLs from Java

介紹

在此演練中,我們將介紹如何C/C++編譯成Windows DLL的代碼可以從Jav調用使用J/Invoke。

我們將使用Microsoft Visual Studio 2005創建一個包含C++函數的DLL,並藉助Eclipse Java IDE編寫Java代碼。其他IDE的步驟將類似。儘管您對Visual Studio或Eclipse不是很熟悉,但我們鼓勵您與我們一起「完成」這一練習 - 這很簡單,而且很有趣!

要運行這個例子,你應該運行Windows 2000,XP,Vista或2003

焦耳/調用需要Java SE開發工具包。由於它使用Java註釋,因此需要JDK 5.0或更高版本。在這裏獲取Java。

Continue Reading ...

+1

這些鏈接似乎不會重定向到您想要的位置 – gismo 2016-08-03 09:02:18

相關問題