Vik*_*yan 5 java eclipse import dll android
Java Native Interface(JNI)是java的一个有趣的接口通过 使用Java Native Interface(JNI),您可以与其他应用程序和库一起使用.
JNI是Java的本机编程接口,是JDK的一部分.使用JNI,您可以使用其他语言(如C,C++)编写的其他应用程序和库.但是基本的问题出现在我应该何时使用JNI?
下面给出简单示例; 看看方法有'本机'KeyWord:
public native void displayHelloWorld();
public native void displayOther();
private native String getLine(String prompt);
Run Code Online (Sandbox Code Playgroud)
我们将使用的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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用编译上面的代码(这是什么意思?)
prompt>javac firstJNI.java
Run Code Online (Sandbox Code Playgroud)
然后使用创建头文件(这是什么意思?)
prompt>javah javah -jni HelloWorld
Run Code Online (Sandbox Code Playgroud)
这将创建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);
----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
不要编辑标题文件
现在让我们看看如何使用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);
}
Run Code Online (Sandbox Code Playgroud)
现在我对如何在我的java应用程序中使用C++/C编写的.dll文件有疑问.我正在使用Eclipse开发android的应用程序,我有一些dll文件,我没有他们的源...我如何在我的项目中使用它们?
首先是免责声明 - 我对此有点粗略,自从我使用 JNI 以来已经有一段时间了。
许多 JNI 示例假设您拥有要调用的库的代码,但根据我的经验,这种情况很少见。在示例中,您看到 javah util 已用于生成头文件,并针对该头文件编写了 cpp 实现 - 这就是为什么您可以在 cpp 文件中看到 jni 头文件和各种 Java 关键字。
为了使用第 3 方 dll,您首先需要该 dll 的文档,否则您就一事无成。您需要文档的原因是您将提供一个简单委托给第 3 方 dll 的包装器 dll - 您需要知道如何调用它以及如何执行任何类型映射。显然,这个包装器将包含所有 JNI 内容,以允许 Java 调用该包装器,进而调用第 3 方 dll。
有多种方法可以做到这一点,但我知道的最简单的方法是使用SWIG,它将生成包装器 dll 所需的所有 C++ 代码。拥有了解 C++ 的人也很有帮助 - 他们在编写 SWIG 用于生成包装器代码的接口文件(.i 或 .swg 文件)时将非常有用。
| 归档时间: |
|
| 查看次数: |
21056 次 |
| 最近记录: |