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 次  |  
        
|   最近记录:  |