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);
}
}
使用编译以上代码 (这是什么意思?)
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
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文件,但我没有它们的源代码……如何在我的项目中使用它们?