2011-05-06 32 views
5

Java Native Interface (JNI)Làm thế nào để nhập khẩu .dll cho dự án java Android (làm việc với nhật thực)

Java Native Interface (JNI) là một trong những giao diện intersting bằng java By sử dụng Java Native Interface (JNI) có thể hoạt động với các ứng dụng khác và thư viện.

JNI là giao diện lập trình gốc cho java là một phần của JDK. Sử dụng JNI bạn có thể hoạt động với các ứng dụng và thư viện khác được viết bằng ngôn ngữ khác như C, C++. Nhưng câu hỏi cơ bản nảy sinh khi tôi nên sử dụng JNI?

  1. Bạn muốn có một số thông tin cụ thể và nền tảng thư viện lớp Java chuẩn có thể không hỗ trợ các tính năng nền tảng cần thiết phụ thuộc vào ứng dụng của bạn.
  2. Bạn có một số ứng dụng thư viện được viết bằng ngôn ngữ khác và bạn muốn sử dụng nó trong ứng dụng java của mình.
  3. Bạn muốn Java tương tác với một số ngôn ngữ lập trình cấp thấp.

Dưới đây được đưa ra ví dụ đơn giản; Xem các phương pháp có KeyWord 'gốc':

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

DLL chúng tôi sẽ sử dụng là firstJNI.DLL DLL này có thể được tạo bởi VC++ hoặc borland. Mà chúng ta sẽ thảo luận sau.

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

Biên dịch mã trên sử dụng (điều này có nghĩa là gì?)

prompt>javac firstJNI.java 

Sau đó tạo tiêu đề tệp sử dụng (điều này có nghĩa là gì?)

prompt>javah javah -jni HelloWorld 

này sẽ tạo tệp firstJNI.h. Trong File tiêu đề bạn sẽ thấy

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

Không được chỉnh sửa tiêu đề tệp

Bây giờ chúng ta hãy xem làm thế nào để tạo ra DLL sử dụng VC++, Click: File-> New-> Win32Dynamic-Link Library Hãy cho đặt tên và chọn Một dự án DLL đơn giản Bạn sẽ phải nộp firstJNI.CPP Dưới đây được đưa ra file 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); 

} 

Bây giờ tôi có câu hỏi về cách tôi có thể sử dụng tệp .dll được viết bằng C++/C trong ứng dụng java của tôi. Tôi đang phát triển ứng dụng cho android bằng cách sử dụng Eclipse và tôi có một số tập tin dll và tôi đã không nguồn của họ ... Làm thế nào tôi có thể sử dụng chúng trong dự án của tôi?

+0

Vì vậy, bạn cố gắng thêm các tập tin dll vào dự án Android mẹ đẻ của bạn? Tôi kinda mắc kẹt trong đó, nhìn ở đây http: // stackoverflow.com/questions/28393305/using-dll-library-in-android-application –

Trả lời

3

Lần đầu tiên một từ chối trách nhiệm - Tôi là một chút sơ sài về vấn đề này, nó được một lúc vì tôi đã sử dụng JNI.

Nhiều ví dụ JNI giả sử bạn sở hữu mã cho thư viện mà bạn muốn gọi, điều mà trong kinh nghiệm của tôi hiếm khi xảy ra. Trong ví dụ bạn thấy javah util đã được sử dụng để tạo ra một tệp header, đối với việc thực thi cpp đã được viết - đây là lý do tại sao bạn có thể thấy tệp tiêu đề jni và các từ khóa Java khác nhau trong tệp cpp.

Để sử dụng dll bên thứ 3, trước tiên bạn cần tài liệu cho dll đó, mà không có bạn đã chết trong nước. Lý do bạn cần các tài liệu là bạn sẽ cung cấp một dll wrapper mà chỉ đơn giản là đại biểu cho dll bên thứ 3 - bạn cần phải biết làm thế nào để gọi nó và làm thế nào để thực hiện bất kỳ ánh xạ kiểu. Rõ ràng đó là wrapper này sẽ chứa tất cả các công cụ JNI để cho phép Java thực hiện cuộc gọi đến trình bao bọc đó, mà lần lượt gọi dll của bên thứ ba.

Có nhiều cách khác nhau để thực hiện điều này, nhưng cách dễ nhất tôi biết là sử dụng SWIG, sẽ tạo tất cả mã C++ bắt buộc cho dll trình bao bọc. Nó cũng giúp có một ai đó biết C++ trên tay - chúng sẽ là các tệp giao diện bằng văn bản vô giá (các tệp .i hoặc .swg) mà SWIG sử dụng để tạo mã trình bao bọc.

1

Tôi không nghĩ rằng bạn sẽ có thể sử dụng thư viện gốc của Windows (.dll) trong ứng dụng Android. Để tải trên Android, mã sẽ cần phải được tích hợp vào .so.

+0

Đúng vậy, mã C++ phải được biên dịch cho nền tảng đích, thường tạo ra một tệp dll trên Windows hoặc một tệp trên Unix. –

+0

OK cho phép nói rằng tôi có thư viện .so mà tôi đã biên soạn trong linux và tôi có tài liệu hoặc mã nguồn. Tôi phải làm gì để thực hiện nó trong nhật thực? –

0

Điều này là dành cho đơn giản Java không dành cho Android:

Calling DLLs from Java

Calling C/C++ DLLs from Java

Giới thiệu

Trong hướng dẫn này, chúng tôi sẽ hiển thị như thế nào C/C++ mã được biên dịch thành một DLL Windows có thể được gọi từ Jav sử dụng J/Invoke.

Chúng tôi sẽ sử dụng Microsoft Visual Studio 2005 để tạo một DLL có chức năng C++ và viết mã Java với sự trợ giúp của Eclipse Java IDE. Các bước cho các IDE khác sẽ tương tự. Chúng tôi khuyến khích bạn 'đi qua' bài tập này với chúng tôi, ngay cả khi bạn không quen thuộc với Visual Studio hoặc Eclipse - nó rất dễ dàng và rất thú vị!

Để chạy ví dụ này, bạn nên chạy Windows 2000, XP, Vista hoặc 2003.

J/Gọi đòi hỏi một bộ phát triển Java SE. Vì nó sử dụng chú thích Java, nên cần JDK phiên bản 5.0 trở lên. Nhận Java ở đây.

Continue Reading ...

+1

những liên kết đó dường như không chuyển hướng nơi bạn muốn họ – gismo

Các vấn đề liên quan