2011-05-06 16 views
5

Java Native Interface (JNI)Nasıl (Tutulma ile çalışan) Android java projeye .dll ithal etmek

Java Native Interface (JNI) Java Native Interface kullanılarak By java tarafından Intersting arayüz biridir (JNI'yı) , diğer uygulamalar ve kütüphaneler ile çalışabilir.

JNI, JDK'nın bir parçası olan java için yerel programlama arabirimidir. JNI kullanarak C, C++ gibi diğer dilde yazılmış diğer uygulamalar ve kütüphaneler ile çalışabilirsiniz. Ama temel soru JNI'yi ne zaman kullanmalıyım?

  1. Bazı platforma özel bilgiler ve standart bir Java sınıfı kütüphanesi uygulama tarafından ihtiyaç duyulan bir platform bağımlı özelliklerini desteklemiyor olabilir istiyoruz.
  2. Diğer dilde yazılmış bazı kitaplık uygulamanız var ve bunu java uygulamanızda kullanmak istiyorsunuz.
  3. Java'nın düşük düzeyli bir programlama dili ile etkileşime girmesini istersiniz. Aşağıda

Basit Örnek verilir;

biz kullanacağız DLL firstJNI.DLL Bu DLL VC oluşturulabilir olduğu
public native void displayHelloWorld(); 
public native void displayOther(); 
private native String getLine(String prompt); 

++ veya Borland: metotları 'yerli' KeyWord sahip olduğunu görüyoruz. Daha sonra tartışacağız.

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

kullanarak yukarıdaki kodu derlemek (bu ne anlama geliyor?)

prompt>javac firstJNI.java 

Sonra (bu ne anlama geliyor?)

prompt>javah javah -jni HelloWorld 

Bu kullanarak başlık dosyası oluşturmak firstJNI.h dosyasını oluşturacak. başlık Dosya göreceksiniz

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

başlık Dosya düzenleme yapmayın

Şimdi tıkla VC++ kullanarak DLL oluşturmak görelim: File-> New-> Win32Dynamic-Linki Kütüphane verin isim ve seç Sen firstJNI.CPP Aşağıda dosyası olacak basit DLL projesi firstJNI.cpp dosyası verilir

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

} 

Şimdi java uygulamasında C++/C ile yazılan .dll dosyasını nasıl kullanabileceğim hakkında sorularım var. Ben Eclipse kullanarak android için uygulama geliştiriyorum ve bazı dll dosyaları var ve onların kaynağı yok ... Ben onları projemde kullanabilir miyim ???Bir süre oldu, bu konuda biraz kabataslak değilim -

+0

Yani, yerli android projeye dll dosyaları eklemek başardı? Bu konuda sıkışıp kaldım, buraya http: // stackoverflow bakın.com/questions/28393305/using-dll-kütüphane-in-android-uygulama –

cevap

3

reddi İlk yardım Umut kullanmak gerektiğini düşünüyorum JNI kullandığımdan beri.

Birçok JNI örneği, aramak istediğim kitaplık için kendi kodunuzun sahibi olduğunuzu varsayar, ki bu benim durumumda nadiren durumdur. Gördüğünüz örnekte, javah kullanımı, cpp uygulamasının yazıldığı bir başlık dosyası oluşturmak için kullanılmıştır. Bu nedenle, jpe üstbilgi dosyasını ve cpp dosyasındaki çeşitli Java anahtar sözcüklerini görebilirsiniz.

Bir üçüncü taraf dll'si kullanmak için, önce suda düzelmediğiniz sürece bu dll belgelerine ihtiyacınız vardır. Dokümantasyona ihtiyacınız olmasının nedeni, 3. taraf dll'ye basitçe delege edebileceğiniz bir sarmalayıcı dll sağlayacağınızdır - bunu nasıl çağırmanız gerektiğini ve herhangi bir tür eşlemenin nasıl yapıldığını bilmeniz gerekir. Açıkçası, Java'nın bu sarıcıya çağrı yapmasına izin vermek için tüm JNI öğelerini içerecek olan bu sarıcı, sırayla 3. taraf dll.

Bunu yapmanın çeşitli yolları var ancak bildiğim en kolay yol, sarıcı dll için gereken tüm C++ kodunu oluşturacak olan SWIG kullanmaktır. Ayrıca, C++'yı bilen birisine sahip olmanıza yardımcı olur - SWIG'in sarmalayıcı kodunu oluşturmak için kullandığı paha biçilmez yazı arayüzü dosyaları (.i veya .swg dosyaları) olur.

1

Bir Android uygulamasında Windows yerel kitaplığı (.dll) kullanabileceğinizi düşünmüyorum. Android'e yüklemek için kodun bir .so.

+0

Bu doğru, C++ kodu, genellikle bir dll dosyası Windows veya Unix üzerinde bir dosya üreten, hedef platform için derlenmiş olması gerekir. –

+0

Tamam, linux'da derlediğim .so kitaplığına sahip olduğumu ve belge veya kod kaynağımız olduğunu söyleyelim. Eclipse'de uygulamak için ne yapmalıyım? –

0

Bu Madde, Android için değil Basit Java içindir: Bu örneklerde ise

Calling DLLs from Java

Calling C/C++ DLLs from Java

Giriş

, nasıl C/C gösterecektir ++ bir Windows DLL içine derlenmiş kod Jav denir J/Invoke kullanarak.

Microsoft Visual Studio 2005'i, C++ işlevlerine sahip bir DLL oluşturmak ve Eclipse Java IDE'nin yardımıyla Java kodunu yazmak için kullanacağız. Diğer IDE'lerin adımları benzer olacaktır. Visual Studio veya Eclipse ile tanışmamış olsanız bile, bu alıştırmayı bizimle birlikte yürütmenizi öneririz. Bu kolay ve eğlenceli!

Bu örneği çalıştırmak için, Windows 2000, XP, Vista veya 2003.

J/Invoke çalışıyor olması gereken bir Java SE geliştirici kiti gerektirir. Java ek açıklamaları kullandığından, JDK sürüm 5.0 veya üstü gereklidir. Java'yı buraya getirin.

Continue Reading ...

+1

Bu bağlantılar, onları istediğiniz yere yönlendirmek için görünmüyor – gismo

İlgili konular