如何将.dll导入Android java项目(使用eclipse)
Java本机接口(JNI)是其中之一 java的有趣接口 使用Java本机接口(JNI)可以 可以与其他应用程序一起运行 和图书馆 JNI是java的本机编程接口,是JDK的一部分。使用JNI,您可以与其他应用程序和其他语言编写的库(如C、C++)一起操作。但是基本的问题出现了,我什么时候应该使用JNI如何将.dll导入Android java项目(使用eclipse),java,android,eclipse,dll,import,Java,Android,Eclipse,Dll,Import,Java本机接口(JNI)是其中之一 java的有趣接口 使用Java本机接口(JNI)可以 可以与其他应用程序一起运行 和图书馆 JNI是java的本机编程接口,是JDK的一部分。使用JNI,您可以与其他应用程序和其他语言编写的库(如C、C++)一起操作。但是基本的问题出现了,我什么时候应该使用JNI 您需要一些特定于平台的信息,而标准Java类库可能不支持应用程序所需的依赖于平台的功能。 您有一些用其他语言编写的库应用程序,您希望在java应用程序中使用它。 您希望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);
}
}
使用编译上述代码(这意味着什么?
然后使用创建头文件(这意味着什么?
这将创建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项目
你会有
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);
}
//MYVCDLL.cpp:定义DLL应用程序的入口点。
//
#包括“stdafx.h”
#包括“D:\Kanad\Study\codeToad Articles\firstJNI.h”
#包括“jni.h”//可以复制或提供完整路径
#包括
BOOL APICENT DllMain(手柄模块,
德沃德·乌尔打电话的理由,
LPVOID lpReserved
)
{
返回TRUE;
}
外部“C”uu declspec(dllexport)int getMemorySize();
//您的函数定义应该如下所示:
外部“C”uu declspec(dllexport)int getMemorySize()
{//做点什么
记忆状态记忆状态;
int MB=1024*1024;
双倍内存大小;
memoryStatus.dwLength=sizeof(memoryStatus);
GlobalMemoryStatus(&memoryStatus);
__int64 size=memoryStatus.dwTotalPhys;
memSize=(双)大小/MB;
printf(“\n总内存%.0lf MB”,ceil(memSize));
返回0;
}
JNIEXPORT void JNICALL
Java_firstJNI_displayHelloWorld(JNIEnv*env,jobject obj)
{
printf(“你好,世界!这是使用VC++DLL\n”);
}
JNIEXPORT void JNICALL
Java_firstJNI_displayOther(JNIEnv*env,jobject obj)
{
printf(“你好,世界!这是使用VC++DLL的其他函数\n”);
getMemorySize();
}
JNIEXPORT jstring JNICALL
Java_firstJNI_getLine(JNIEnv*env、jobject obj、jstring enter)
{
char-buf[128];
const char*str=env->GetStringUTFChars(输入,0);
printf(“\n%s”,str);
环境->释放StringUTFChars(输入,str);
scanf(“%s”,buf);
返回env->NewStringUTF(buf);
}
现在我有一些问题,关于如何在java应用程序中使用C++/C编写的.dll文件。我正在使用Eclipse为android开发应用程序,我有一些dll文件,但我没有它们的源代码。。。如何在我的项目中使用它们???我不是这些方面的专家,但我认为您应该使用
System.loadLibrary(“comparejni”)代码>
prompt>javac firstJNI.java
prompt>javah javah -jni HelloWorld
希望它有帮助首先是一个免责声明-我对此有点粗略,我已经有一段时间没有使用JNI了
许多JNI示例都假设您拥有要调用的库的代码,根据我的经验,这种情况很少发生。在这个示例中,您可以看到javah util被用来生成一个头文件,cpp实现就是根据这个头文件编写的——这就是为什么您可以在cpp文件中看到jni头文件和各种Java关键字
为了使用第三方dll,您首先需要该dll的文档,否则您将一事无成。您需要该文档的原因是,您将提供一个只需委托给第三方dll的包装dll—您需要知道如何调用它以及如何执行任何类型映射。显然,这个包装器将包含所有JNI内容,以允许Java调用该包装器,该包装器反过来调用第三方dll
<>有很多方法可以做到这一点,但是我知道最简单的方法是使用,它将生成包装DLL所需的所有C++代码。它也有助于有人知道C++的手-他们将是非常宝贵的编写接口文件(.I或.SWG文件),SWIG用来生成包装代码。 < P>我认为你不能在Android应用程序中使用Windows原生库(.dll)。要在Android上加载,代码需要内置到.so中。本文针对的是简单Java,而不是Android:
导言
在本演练中,我们将展示如何使用J/Invoke从Java调用编译成Windows DLL的C/C++代码
我们将使用微软Visual Studio 2005创建具有C++功能的DLL,并在Eclipse java IDE的帮助下编写java代码。其他IDE的步骤将类似。我们鼓励您与我们一起“演练”这个练习,即使您对VisualStudio或Eclipse不是很熟悉——这很简单,也很有趣
要运行此示例,您应该运行Windows 2000、XP、Vista或2003
J/Invoke需要一个JavaSE开发工具包。由于它使用Java注释,因此需要JDK 5.0或更高版本。在这里获取Java
“正确”,C++代码必须为目标平台编译,通常在Windows上生成DLL文件,或者在UNIX上生成SO文件。