Windows 7 NetBeans开发7-Windows 7 64位…;JNI本机调用。。。a如何引导

Windows 7 NetBeans开发7-Windows 7 64位…;JNI本机调用。。。a如何引导,windows-7,64-bit,java-native-interface,netbeans-7,Windows 7,64 Bit,Java Native Interface,Netbeans 7,我提供这个给你,希望能为你节省一些时间和痛苦 作为在我的Windows 64位工作站上了解NB Development v7的一部分经验,我发现了另一个令人沮丧的冒险,那就是尝试在我的项目中使用JNI(Java本机接口)功能。因此,我将简要概述所需的步骤(因为我发现的所有文档对于这些版本的Windows和NetBeans来说,在如何进行JNI方面是完全不正确的)。我花了几天的时间进行实验,并检查了我能找到的每一个包含这些技术作为关键字搜索的网页。大笑!!不好玩 首先,由于NetBeans开发是“

我提供这个给你,希望能为你节省一些时间和痛苦

作为在我的Windows 64位工作站上了解NB Development v7的一部分经验,我发现了另一个令人沮丧的冒险,那就是尝试在我的项目中使用JNI(Java本机接口)功能。因此,我将简要概述所需的步骤(因为我发现的所有文档对于这些版本的Windows和NetBeans来说,在如何进行JNI方面是完全不正确的)。我花了几天的时间进行实验,并检查了我能找到的每一个包含这些技术作为关键字搜索的网页。大笑!!不好玩

首先,由于NetBeans开发是“关于模块的”,如果您正在阅读本文,您可能需要一个或多个模块来执行JNI调用。本网站或互联网上提供的大部分内容(更不用说NB7中的帮助文件)对于这些版本来说要么是完全错误的,要么是非常稀少,以至于对JNI专家以外的任何人都没有用

这是你要找的。。。“切入正题”-“如何指导”以获得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);
    }
<path_to_Microsoft_Visual_Studio_10.0>/VC/vcvarsall.bat amd64
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"));
}
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
请注意,您不能简单地返回一个普通的Java字符串(因为您现在使用的是C)。您必须告诉传入的JVM变量,以便为您创建一个将返回的Java字符串。查看以下内容以及如何为JNI目的创建它们

6) 关闭并保存对头文件的更改。现在,您已经在头文件中添加了一个实现,将文件扩展名从“.h”更改为“.c”,因为它现在是一个正确实现JNI所需接口的c源代码文件

例如: 国家接口测试

7) 我们需要编译新创建的源代码文件并链接它。在命令提示符中键入以下命令:

cl/I“路径到我的JDK包括文件夹”/I“路径到我的JDK包括win32文件夹”/D:AMD64=1/LD NativeInterfaceTest.c/FeNativeInterfaceTest.dll/link/machine:x64

例如:

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);
    }
<path_to_Microsoft_Visual_Studio_10.0>/VC/vcvarsall.bat amd64
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"));
}
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”文件夹路径周围的引号是必需的,因为我的文件夹名称中有空格…“程序文件”。如果没有空格,则可以包含它们,但如果在使用命令提示符时有空格,则必须包含它们

这将生成几个文件,但我们感兴趣的是DLL。这就是System.loadLirbary()java方法所寻找的

8) 恭喜!您已进入最后一步。只需获取DLL程序集并将其粘贴到以下位置:

<path_of_NetBeansProjects_folder>/<project_name>/<module_name>/build/cluster/modules/lib/x64
现在,在Java代码中,您可以创建一个NativeInterfaceTest对象并调用echoString()方法,它将返回您在NativeInterfaceTest.c源代码文件中键入的字符串值


希望这能帮你避免我独自解决这一切时遭受的大脑损伤。祝你好运,编码愉快!

因为这个问题不是问题,而是怎么做,我的答案不是答案,而是怎么做:

您的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
允许将dllName32.dll和dllName64.dll打包在同一目录中


…这只是另一个人的意见。

既然SO的一般形式是先提问,然后回答,那么将其重新组织成一个适当的问题,然后再提供并接受一个答案可能是值得的。有了这个问题可能会让感兴趣的人觉得更容易一些。无论如何,感谢您在e努力收集看起来是一套非常详细的知识。谢谢Robert。是的,我知道。我们确实需要在这里有一个部分,用户提交的是“如何指导”。我不能代表你发言,但有几次我问了一些社区的问题,“置若罔闻”。或者没有人知道答案(可能,但不太可能),或者我没有适当地寻求帮助(更有可能),或者,无论出于什么原因,没有人愿意回答(可能也有可能)。不管怎样,为了帮助防止其他成员浪费大量时间,我已经开始提供其中的一些。开始新的部分需要什么?您确定这两个
loadLibrary
调用没有问题,这取决于您使用的是哪种体系结构?
loadLibrary
将搜索t库路径,加载它找到的第一个具有匹配名称的库。我从未有过明智的行为将路径(相对或绝对)传递到
loadLibrary
。我认为,它的设计目的是只获取库的名称,而不是路径。
load
,另一方面,它可以让您显式地命名单个文件,并为您提供c关于“如何”的问题:我同意RobertB和CirrusFlyer在这方面的观点,并建议,在出现更好的情况之前,发布“如何”项目的方法是假装你正在播放电视节目“Jeopardy”,然后以问题的形式发布你的答案。也就是说,比如这是一个很好的方法来做我想做的事情,还是有人能看到我还没有看到的问题?“我收到了一些很好的回复。是的,史蒂夫……我确定。我在这里发布的内容正在发挥作用。可能还有其他方法来完成我在这里详细介绍的内容,但这确实起到了作用。我已经有8个月的时间没有为自己找到解决这些问题的乐趣了……我想找个人来思考一下。”(最好是NetBeans)正在进行更完整、更权威的描述。