【问题标题】:ColdFusion 2016 call to Java TensorFlow API Could Not Initialize ClassColdFusion 2016 对 Java TensorFlow API 的调用无法初始化类
【发布时间】:2017-04-30 01:35:43
【问题描述】:

我正在尝试从 Windows 10 Home 上的 ColdFusion 2016 开发人员版调用 TensorFlow Java API。

我从 TensorFlow Readme.md 中获得灵感,它除了使用 jar 之外,还使用特定于平台的 JNI dll,因此我将测试设置如下: <cfscript> CreateObject("java","java.lang.System").load("C:\\absolutepath\\tensorflow_jni.dll"); variables.tensorflow = CreateObject("Java","org.tensorflow.TensorFlow"); WriteDump(variables.tensorflow); WriteOutput("I'm running TensorFlow version: " & variables.tensorflow.version()); </cfscript>

当我看到对象的WriteDump时,我以为这会是小菜一碟:

但是对 version() 的调用只会让浏览器旋转。

应用程序日志显示以下错误: Could not initialize class org.tensorflow.TensorFlow The specific sequence of files included or processed is: C:\ColdFusionBuilder2016\ColdFusion\cfusion\wwwroot\CF_TensorFlow\index.cfm, line: 5

JNI 似乎正在加载...当它没有加载时,错误消息非常清楚“找不到适用于 OS 的 TensorFlow 本机库:windows...”

我现在不确定该怎么做。我需要对 Java 源代码做些什么以使其与 CF 很好地配合使用吗?

【问题讨论】:

  • 不确定是否/如何在运行时加载。肯定会起作用的是a)将dll路径添加到java.library.path或b)将dll文件复制到jre\bin。然后重新启动。
  • 啊,看起来可以通过在jar中捆绑dll在运行时加载。请参阅下面的答案。

标签: java coldfusion tensorflow java-native-interface coldfusion-2016


【解决方案1】:

您可能已经知道,该库首先在标准位置搜索 DLL。因此,将路径或文件添加到这些位置之一(然后重新启动 CF)肯定会起作用:

  • 将DLL路径添加到java.library.path
  • 将DLL文件复制到jre\bin目录下

查看the source and comments,显然 DLL 也可以捆绑在 TensorFlow jar 本身中。确切的路径是特定于操作系统的:

private static String makeResourceName() {
    return "org/tensorflow/native/"
        + String.format("%s-%s/", os(), architecture())
        + System.mapLibraryName(LIBNAME);
}

因此,不要使用System.load(),而是打开 jar 并将 DLL 复制到相应的文件夹中。对于 Windows 64 位,预期路径为 org/tensorflow/native/windows-x86_64/tensorflow_jni.dll

libtensorflow-1.1.0-rc2-with-dll.jar 

  |-- META-INF
  |-- org    
      |-- tensorflow    
          |-- TensorFlow.class
          |-- ... 
          |-- native 
              |-- windows-x86_64
                  |-- tensorflow_jni.dll

【讨论】:

  • 感谢您的勤奋,Leigh。当我回到我的工作站时我会试试这个,然后会报告。
  • 太棒了!谢谢你。这就像捆绑一样简单。回想起来,我错过了一些应该跳出来的事情。当我第一次尝试捆绑它时,我将它放在一个字面上称为 native/OS-ARCH 而不是 native/windows-x86_64 的文件夹中。我对你提到的路径没有任何运气。我认为 JNI 工作正常,因为将 JAR 和 DLL 放入 WEB-INF\lib 文件夹后,我不再看到“找不到 TensorFlow 原生库”错误,但它仍然给出“无法初始化类”错误。然而,捆绑非常有效。
  • 呵呵,我也犯了os-arch的错误。无论如何,很高兴它有所帮助。 RE:你提到的路径没有任何运气 嗯......很奇怪。你后来重启了吗?这是必需的。将 DLL 复制到 jre\bin 对我有用。我没有尝试java.library.path,但假设它可以作为Windows PATH 环境变量非常标准。尽管将它与 jar 捆绑在一起可能是最好的方法,因为它更具动态性。
  • 我确实重启了,是的。您只需将两者都直接放在该文件夹中 - 而不是放在子文件夹中,对吧?
  • (编辑)是的,没有子文件夹,只有 DLL 文件。我像往常一样用this.javaSettings 加载的.jar。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多