簡體   English   中英

結構 JNA 返回錯誤值

[英]Structure JNA returns wrong value

從 C++ 代碼我得到了結構。但是我得到的所有值都是默認值。下面是我的 C++ 代碼

extern "C" 
{ 
PDFCONTENTDATA GetPDFContentData(LPTSTR lptszS3FileURL)
{
PDFCONTENTDATA pdfContentData;
pdfContentData.m_uiRasterDPI = 100;

return pdfContentData;
}
}; 

下面是我的 java/scala 代碼

@Structure.FieldOrder({ "m_uiRasterDPI"})
public class tagPDFContentData extends Structure {

    public static class ByValue extends tagPDFContentData implements Structure.ByValue { }
    public static class ByReference extends tagPDFContentData implements Structure.ByReference { }
    public volatile int m_uiRasterDPI;
}


trait CDocuLinkCoreServices extends Library{
  def GetPDFContentData(value: Pointer):  tagPDFContentData.ByValue
}

但我越來越

m_uiRasterDPI = 0

它應該返回 100 的地方。

給你: https : //github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo057

為了順利調用JNA ,有一個 Java 類recipeNo057.Data 這門課超級簡單

package recipeNo057;

import com.sun.jna.Library;
import com.sun.jna.WString;
import com.sun.jna.Native;
import com.sun.jna.Structure;

@Structure.FieldOrder({ "field" })
public class Data extends Structure {

    public static class ByValue extends Data implements Structure.ByValue { }
    public static class ByReference extends Data implements Structure.ByReference { }
    public volatile int field;

}

另一方面( C++端)我們有“相同”的結構。

typedef struct data {
  int field;
} 

Scala 通過“鏈接”基於Java的類、基於JNA的對本機代碼的調用以及C++本身的本機代碼將所有這些內容綁定在一起。

trait HelloWorld extends Library {

  def GetData(m: WString) : Data.ByValue;

}

object HelloJNA {

  def main(args:Array[String]):Unit = {

    val libc   = Native.load( "HelloWorld", classOf[HelloWorld] )

    var result = libc.GetData( new WString("I am passing String!") )
    println("Result: " + result.field);

  }
}

筆記

注意Java結構和C++結構之間的類型匹配很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM