当前位置: 首页 > 面试题库 >

如何将.dll导入Android Java项目(使用Eclipse)

唐烨煜
2023-03-14
问题内容

Java本机接口(JNI)

Java本机接口(JNI)是java的有趣接口之一,通过 使用Java本机接口(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是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); 
     }
}

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

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,单击: 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);

}

现在,我对如何在Java应用程序中使用以C ++ / C编写的.dll文件有疑问。
我正在使用Eclipse开发适用于android的应用程序,并且我有一些dll文件,但我没有它们的源代码……如何在我的项目中使用它们?


问题答案:

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

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

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

有多种方法可以做到这一点,但我知道最简单的方法是使用SWIG,它将生成包装dll所需的所有C
代码。如果有人熟悉C ,这也会有所帮助-他们将非常宝贵地编写SWIG用来生成包装器代码的接口文件(.i或.swg文件)。



 类似资料:
  • 问题内容: 我正在尝试导出Java项目。我可以通过使用选项导出-> Java-> JAR文件来创建JAR文件。我无法将此jar文件导入Eclipse(Java的没有导入选项)。我在这里做错什么了吗? 针对Web开发人员使用Eclipse Java EE IDE(版本:Juno发行版) 问题答案: 有比导出和导入罐子更简单的方法。假设您的项目名为MyProject123。只是: 只需使用文件管理器打

  • 我想将我的Eclipse项目导入IntelliJ IDEA,所以我转到了IntelliJ IDEA帮助页面: 如果IntelliJ IDEA中当前没有打开的项目,请单击欢迎屏幕上的导入项目。否则,选择文件|导入项目。 问题是欢迎屏幕上没有导入项目选项,文件菜单中也没有导入项目选项。 有什么办法吗? 我查看了更新,它告诉我我的11.1.3版本是最新的,尽管帮助页面的标题栏中有12.0。

  • 问题内容: 将Java项目导入到我的工作区时遇到一些问题。我下面这个教程 -但我不能使用最后 导入现有项目的 步骤,因为Git仓库我用不包括Eclipse的具体和文件。 使用“新建项目”向导 因此,该项目不被识别为项目,因此无法导入。因此,我使用了“ 使用新建项目”向导 选项,并在下一个对话框中选择“ Java项目”,尝试了运气。问题在于这将创建一个没有任何内容的新Java项目!该项目也未连接到G

  • 问题内容: 我是一位有抱负的Java程序员,希望在项目中使用JSON。我正在遵循一个编程教程(从书​​中),该教程要求我使用以下行将JSON导入到我的项目中: 但这产生了一个错误,因此我用以下代码替换了它: 这也会产生一个(不同的)错误: 导入org.json无法解析 我认为问题是我的Eclipse工作区中实际上没有JSON库。如何执行此操作,以便可以使用JSONArray?我找到了用于JSON的

  • 如您所见,这个错误来自AndroidManifest。xml,它发生在android studio中,我查了很多信息,不知道它是如何产生的,如果你能帮我一把,我很感激。 我想添加的另一件事是,该活动在此文件中显示了illeagal。

  • 问题内容: 我有一个本地CMake项目,并且我想与它一起使用Eclipse IDE,以便通过提供自动完成功能和其他功能使我的开发更加轻松。我似乎找不到如何在Eclipse中导入CMake项目的方法。 PS:我愿意征求其他与CMake一起使用的IDE的建议。 问题答案: KDevelop是一个很棒的IDE,具有强大的CMake支持。 至于Eclipse-运行以下命令: 这将为您生成Eclipse项目