Java本机接口(JNI)
Java本机接口(JNI)是java的有趣接口之一,通过 使用Java本机接口(JNI),您可以与其他应用程序和库一起使用 。
JNI是Java的本地编程接口,它是JDK的一部分。使用JNI,您可以使用以其他语言(例如C,C
++)编写的其他应用程序和库进行操作。但是基本的问题出现了,我什么时候应该使用JNI?
下面给出简单的例子;看到方法具有“本地”关键字:
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项目