gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:47 25 4
gpt4 key购买 nike

Java Native Interface (JNI)

Java Native Interface (JNI) is one of the intersting interface by java By using Java Native Interface (JNI) you can operate with other applications and libraries.

JNI 是 java 的 native 编程接口(interface),是 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首先是JNI.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

这将创建 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,点击:文件->新建->Win32动态链接库命名并选择一个简单的DLL项目你将会有第一个JNI.CPP文件下面给出第一个JNI.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 文件有疑问。我正在使用 Eclipse 为 android 开发应用程序,我有一些 dll 文件,但我没有它们的源代码......我如何在我的项目中使用它们???

最佳答案

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

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

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

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

关于java - 如何将 .dll 导入 Android java 项目(使用 eclipse),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5908660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com