NetBeans Development 7-Windows 7 64-bit … JNI本地调用…如何指导

 2023-01-20    254  

问题描述

我为您提供了希望能节省一些时间和痛苦.

作为我在Windows 64位工作站上了解NB开发V7的经验的一部分,我发现了另一个令人沮丧的冒险,试图使JNI(JAVA本地界面)能力提高并在我的项目中工作.因此,我包括了所需步骤的简要摘要(因为我发现的所有文档对于这些版本的Windows和Netbeans都完全不正确.花了几天的实验和查看每个网页,我可以找到包括这些技术作为关键字搜索. Yuk!不有趣.

NetBeans Development 7-Windows 7 64-bit … JNI本地调用…如何指导

开始,因为NetBeans开发是”关于模块的所有内容”,如果您正在阅读此书,则可能需要一个或更多的模块来执行JNI调用.这些网站或互联网上可用的大部分内容(更不用说NB7中的帮助文件)要么完全是错误的,要么稀疏,以至于除了JNI专家以外的任何人本质上都无用.

这是您要寻找的…”切入追逐” – “如何指导”来呼叫并在NB7/Windows 64位盒子上工作.

1)从您的NetBeans模块中(而非主机应用程序)声明您的本机方法,并确保您可以不用错误编译Java源.

示例:

package org.mycompanyname.nativelogic;

    public class NativeInterfaceTest
    {
        static
        {
            try
            {
                if (System.getProperty( "os.arch" ).toLowerCase().equals( "amd64" ) )
                    System.loadLibrary( <64-bit_folder_name_on_file_system>/<file_name.dll> );
                else
                    System.loadLibrary( <32-bit_folder_name_on_file_system>/<file_name.dll> );
            }
            catch (SecurityException se) {}
            catch (UnsatisfieldLinkError ule) {}
            catch (NullPointerException npe) {}
        }

        public NativeInterfaceTest() {}

        native String echoString(String s);
    }

请注意以下事实:我们只加载一次组件(因为它在静态块中),因为否则,如果尝试再次加载它,则会抛出异常.还要注意我们的单个(在此示例中)的本机方法,名为” Echostring”.这是我们的C/C ++应用程序将要实现的方法,然后通过JNI的Majic我们将从我们的Java代码中调用.

2)如果使用64位版本的Windows(我们在这里),我们需要打开一个64位Visual Studio命令提示符(与标准32位版本相比,并执行” VCVARSALL” BAT文件,以及一个” AMD64″命令行参数,为64位工具设置环境.

示例:

<path_to_Microsoft_Visual_Studio_10.0>/VC/vcvarsall.bat amd64

请注意,您可以从您希望的Microsoft使用任何版本的C/C ++编译器.我碰巧在盒子上安装了Visual Studio 2005、2008和2010年,因此我选择使用” V10.0″,但是任何支持64位开发的人都可以正常工作.这里的另一个重要方面是” AMD64″参数.

3)在命令提示符中,在计算机上更改驱动器\目录,以便您处于包含本机方法声明的文件系统上完全合格的类位置的根源.

示例:
我本地声明的方法的完全合格的类名称是” org.mycompanyname.nativelogic.nativeinterfacetest”.当我们在上面的步骤1中成功编译了Java时,我们应该发现它包含在Netbeans模块中,类似于以下内容:

“/build/class/org/mycompanyname/nativeLogic/nativeinterfaceTest.class”

我们需要确保我们的命令提示符集,因为我们的下一步是直接的”/build/class”.

4)在此步骤中,我们将创建包含JNI所需语句的C/C ++标头文件.在命令提示符中键入以下内容:

javah -jni org.mycompanyname.nativelogic.NativeInterfaceTest并点击输入.如果您收到任何类型的错误,则说明这是一个未识别的命令,这仅表示您的Windows计算机不知道该命令的路径(它在您的/bin文件夹中).从那里运行命令,或者在调用此应用程序时包含完全限定的路径名​​,或者将计算机的路径环境变量设置为将该路径包括在其搜索中.

这应该产生一个名为” org_mycompanyname_nativelogic_nativeinterfaceTest.h”的文件.如果您稍后需要备份,我会副本.

5)编辑本机InterfaceTest.h标头文件,并包含eChoString()方法的实现.

示例:

JNIEXPORT jstring JNICALL Java_org_mycompanyname_nativelogic_NativeInterfaceTest_echoString
  (JNIEnv *env, jobject jobj, jstring js)
{
    return((*env)->NewStringUTF(env, "My JNI is up and working after lots of research"));
}

注意如何不能简单地返回普通的Java字符串(因为您目前在C中).您必须在JVM变量中告诉传递,以为您创建一个将返回的Java字符串.查看以下其他数据类型的Oracle网页为了JNI目的创建它们.

6)关闭并将更改保存到标题文件中.现在,您已经在标题中添加了一个实现,将文件扩展名从” .h”更改为” .c”,因为现在是一个C源代码文件,可以正确实现JNI必需的接口.

示例:
本机InterfaceTest.c

7)我们需要编译新创建的源代码文件并将其链接.从命令提示符中输入以下内容:

cl/i” path_to_my_jdks_include_folder”/i” path_to_to_my_jdks_inc_include_include_win32_folder”/d:amd64 = 1/ld nativeInterfaceTest.c/fenitiveInterfaceTest.c/fenativeInterfaceTest.dll/link/link/link/link/p> x64

x64

x64

x64

x64

x64

示例:

cl /I"D:/Program Files/Java/jdk1.6.0_21/include" /I"D:/Program Files/java/jdk1.6.0_21/include/win32" /D:AMD64=1 /LD NativeInterfaceTest.c /FeNativeInterfaceTest.dll /link /machine:x64

请注意,需要” include”和” include/win32″文件夹的路径周围的报价,因为我的文件夹名称中有空格…’program files’.如果没有问题,则可以包含它们,但是如果您使用命令提示符时有空格,则它们是强制性的.

这将生成多个文件,但这是我们感兴趣的DLL.这就是System.loadLirbary()Java方法正在寻找的.

8)恭喜!您正在最后一步.只需将DLL组件粘贴在以下位置:

<path_of_NetBeansProjects_folder>/<project_name>/<module_name>/build/cluster/modules/lib/x64

请注意,您可能必须创建” lib”和” x64″文件夹.

Example:
C:\Users\<user_name>\Documents\NetBeansProjects\<application_name>\<module_name>\build\cluster\modules\lib\x64\NativeInterfaceTest.dll

Java代码…注意我们如何不插入loadLibrary()调用中的” .dll”文件扩展名?

System.loadLibrary( "/x64/NativeInterfaceTest" );

现在,在您的Java代码中,您可以创建一个本机InterfaceTest对象并调用eChoString()方法,并且它将返回您在本机InterinterfaceTest.c源代码文件中键入的字符串值.

.

希望这将为您节省我遭受的脑部伤害,试图自己弄清楚这一切.祝你好运和愉快的编码!

推荐答案

由于这个问题不是一个问题,而是一个问题,我的答案不是答案,而是howido:

您的32/64技术需要DLL的单独目录.

if (System.getProperty( "os.arch" ).toLowerCase().equals( "amd64" ) )
   System.loadLibrary( <64-bit_folder_name_on_file_system>/<file_name.dll> );
else
   System.loadLibrary( <32-bit_folder_name_on_file_system>/<file_name.dll

这是Howido:

String archDataModel = System.getProperty("sun.arch.data.model");
System.loadLibrary("dllName" + archDataModel);

允许dllname32.dll和dllname64.dll包装在同一目录中.

…只是另一个男人的意见.

以上所述是小编给大家介绍的NetBeans Development 7-Windows 7 64-bit … JNI本地调用…如何指导,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26020.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。