如何将.dll导入Android java项目(使用eclipse)

Vik*_*yan 5 java eclipse import dll android

Java本机接口(JNI)

Java Native Interface(JNI)是java的一个有趣的接口通过 使用Java Native Interface(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);
Run Code Online (Sandbox Code Playgroud)

我们将使用的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); 
     }
}
Run Code Online (Sandbox Code Playgroud)

使用编译上面的代码(这是什么意思?)

prompt>javac firstJNI.java
Run Code Online (Sandbox Code Playgroud)

然后使用创建头文件(这是什么意思?)

prompt>javah javah -jni HelloWorld
Run Code Online (Sandbox Code Playgroud)

这将创建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);
----------------------------------------------
Run Code Online (Sandbox Code Playgroud)

不要编辑标题文件

现在让我们看看如何使用VC++生成DLL,点击: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);

}
Run Code Online (Sandbox Code Playgroud)

现在我对如何在我的java应用程序中使用C++/C编写的.dll文件有疑问.我正在使用Eclipse开发android的应用程序,我有一些dll文件,我没有他们的源...我如何在我的项目中使用它们?

Nic*_*olt 3

首先是免责声明 - 我对此有点粗略,自从我使用 JNI 以来已经有一段时间了。

许多 JNI 示例假设您拥有要调用的库的代码,但根据我的经验,这种情况很少见。在示例中,您看到 javah util 已用于生成头文件,并针对该头文件编写了 cpp 实现 - 这就是为什么您可以在 cpp 文件中看到 jni 头文件和各种 Java 关键字。

为了使用第 3 方 dll,您首先需要该 dll 的文档,否则您就一事无成。您需要文档的原因是您将提供一个简单委托给第 3 方 dll 的包装器 dll - 您需要知道如何调用它以及如何执行任何类型映射。显然,这个包装器将包含所有 JNI 内容,以允许 Java 调用该包装器,进而调用第 3 方 dll。

有多种方法可以做到这一点,但我知道的最简单的方法是使用SWIG,它将生成包装器 dll 所需的所有 C++ 代码。拥有了解 C++ 的人也很有帮助 - 他们在编写 SWIG 用于生成包装器代码的接口文件(.i 或 .swg 文件)时将非常有用。