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

时间:2017-04-30 01:35:43

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

我试图在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时,我认为这将是一块蛋糕:enter image description here

但是对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很好地配合?

1 个答案:

答案 0 :(得分:2)

正如您可能想到的那样,该库首先搜索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