ColdFusion 2016 调用 Java TensorFlow API 无法初始化 Class

ColdFusion 2016 call to Java TensorFlow API Could Not Initialize Class

我正在尝试从 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 似乎正在加载...如果没有,错误消息非常清楚 "Cannot find TensorFlow native library for OS: windows..."

我现在不太确定该怎么做。是否需要对 Java 源代码做些什么才能使其与 CF 兼容?

正如您可能想到的那样,库首先搜索 DLL 的标准位置。因此,将路径或文件添加到这些位置之一(然后重新启动 CF)绝对有效:

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

查看 the source and comments,显然 DLL 也可以捆绑 TensorFlow jar 本身中。确切路径是 o/s 具体的:

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