Member 14061434 Ответов: 3

Я хочу перевести цену предложения из jforex (dukascopy.com) в библиотеку DLL (C++).


Я хочу перевести цену предложения из jforex (Dukascopy.com) в библиотеку DLL (C++).
Но во время выполнения цена (ставка) не отправляется в DLL, я не знаю, в чем проблема?
Это мой код для DLL C++ :

Что я уже пробовал:

DLL.cpp :

#include "stdafx.h"
extern "C"
{
__declspec(dllexport)double ExportBid( double BIDS)
{
    return(BIDS);
}
}

Это мой код для Jforex (Dukascopy.com)
SendBid.java.
package jforex;
import java.util.*;
import java.io.*;
import java.util.*;
import com.dukascopy.api.*;
import com.dukascopy.api.Library;

public class SendBid implements IStrategy {

    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;
    public static native boolean CreateSession();

    public void onStart(IContext context) throws JFException
    {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.context = context;
        this.indicators = context.getIndicators();
        this.userInterface = context.getUserInterface();

    }

    public static void ExportBid(double BIDS)
    {
        System.load("C:\\DLL.dll");
    }

    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {
    }

    public void onStop() throws JFException {
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException{
        double bid =  history.getLastTick(Instrument.EURUSD).getBid();
        ExportBid(bid);
        console.getOut().println("bid :" + bid);
    }

    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    }
}


Как я могу отправить заявку в dll?

Richard MacCutchan

Ваш метод ExportBid на самом деле ничего не делает, кроме загрузки DLL. А чего именно вы ожидаете?

3 Ответов

Рейтинг:
1

Member 14061434

С помощью друга,танков. Мне удалось создать соединение между Java и DLL C++. Но когда код java передается в программу Jforex, код не будет компилироваться. откуда взялась эта проблема?
//------------------------------
//Код java в IntelliJ без ошибок
//------------------------------

public class SendBid {

    static {

        try {
            System.loadLibrary("C:\\Users\\admin\\Desktop\\SendBid\\x64\\Debug\\SendBid.dll");


        } catch (UnsatisfiedLinkError e) {

            System.load("C:\\Users\\admin\\Desktop\\SendBid\\x64\\Debug\\SendBid.dll");

        }


    }


    //private native void sayHello();
    private native double sayHello(double n1);

    public static void main(String[] args) {

        //new HelloJNI().sayHello();  // Create an instance and invoke the native method
        double bid =1.123456;

        new SendBid().sayHello(bid);


        //  new HelloJNI().sayHello();
    }


}

код C++ :
// SendBid.cpp : определяет экспортируемые функции для приложения DLL.

#include "stdafx.h"
#include <jni.h>       // JNI header provided by JDK
#include <iostream>    // C++ standard IO header
using namespace std;

extern "C" {

    JNIEXPORT jdouble JNICALL Java_SendBid_sayHello (JNIEnv *env, jobject obj, jdouble n1) {
    return n1;
    }

}


Код на Java на Jforex. Код Ошибки:

package jforex;

import java.util.*;

import java.io.*;
import java.util.*;

import com.dukascopy.api.*;
import com.dukascopy.api.Library;


public class SendBid implements IStrategy {

  ///*     
    static {

        try {
            System.loadLibrary("C:\\Users\\admin\\Desktop\\SendBid\\x64\\Debug\\SendBid.dll");


        } catch (UnsatisfiedLinkError e) {

            System.load("C:\\Users\\admin\\Desktop\\SendBid\\x64\\Debug\\SendBid.dll");

        }


    }

 //*/

    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;
    public static native boolean CreateSession();
    private native double sayHello(double n1);


    public static void main(String[] args)
    {

            double bid =1.123;    
            new SendBid().sayHello(bid);

    }


    public void onStart(IContext context) throws JFException
    {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.context = context;
        this.indicators = context.getIndicators();
        this.userInterface = context.getUserInterface();   

    }


    public void onAccount(IAccount account) throws JFException {
    }

    public void onMessage(IMessage message) throws JFException {
    }

    public void onStop() throws JFException {
    }

    public void onTick(Instrument instrument, ITick tick) throws JFException {

    }

    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
    }
}


код ошибки:

20:15:26 File is not implementing IStrategy interface.
20:13:36 File is not implementing IStrategy interface.
20:13:01 Cannot load target class
20:13:00 Compiling SendBid.java
20:13:00 File is not implementing IStrategy interface.


Richard MacCutchan

Эти послания совершенно ясны. Проверьте документацию по интерфейсу IStrategy.

Рейтинг:
0

OriginalGriff

Код не делает за вас волшебных вещей: вы должны сказать компьютеру, что вы хотите, чтобы он сделал на понятном ему языке.

Поэтому, когда ваш метод ExportBid выглядит следующим образом:

public static void ExportBid(double BIDS)
{
    System.load("C:\\DLL.dll");
}
Тогда at - это все, что компьютер собирается сделать для вас: он загрузит DLL и больше ничего не сделает. Загрузка библиотеки DLL не выполняет никакого кода внутри нее, так как система понятия не имеет, что она содержит, пока вы не попытаетесь запустить функцию.

Начните с просмотра библиотеки DLL и того, как она работает: затем добавьте код для фактического вызова функций по мере необходимости...


Рейтинг:
0

KarstenK

Вам нужно работать с библиотекой dll для ее использования и использовать лучше написать класс вокруг нее. Сначала вам нужно загрузить dll, потому что это может длиться до нескольких секунд (когда Windows предпочитает делать другие вещи), вы должны сделать это при запуске программы и только один раз.

Окунитесь в некоторые из них Java JNI учебник относительно деталей.

Используйте собственные типы данных для передачи или напишите вокруг них какую-нибудь оболочку. Особенно строки могут быть проблематичными. Поэтому проверьте свой код, когда закончите.