Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将.dll导入Android java项目(使用eclipse)_Java_Android_Eclipse_Dll_Import - Fatal编程技术网

如何将.dll导入Android java项目(使用eclipse)

如何将.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与一些低级编程语言

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文件。