質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

DXライブラリを使ったAndroidゲームに「C++ REST SDK」を導入したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 468

hiyokko

score 6

前提・実現したいこと

DXライブラリを使ったAndroidゲームアプリ開発において、「C++ REST SDK」を利用したGET/POST機能を導入しようと考えています。
こちらの手順通りプロジェクトを作成、NuGetで「cpprestsdk」をインストールし、こちらの通りにプロパティにて変更を行いました。

発生している問題・エラーメッセージ

ビルド・実機で実行しようとすると、画像の様な例外が発生し、解決策が分かりません。画像

また、例外が発生しているファイル(openssl_init.ipp)内では、「thread_id_」「mutexes_」にて「メンバー○○にアクセスできません」とエラーが出ていました。

//
// ssl/detail/impl/openssl_init.ipp
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com
// Copyright (c) 2005-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#ifndef BOOST_ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP
#define BOOST_ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)

#include <boost/asio/detail/config.hpp>
#include <vector>
#include <boost/asio/detail/assert.hpp>
#include <boost/asio/detail/mutex.hpp>
#include <boost/asio/detail/tss_ptr.hpp>
#include <boost/asio/ssl/detail/openssl_init.hpp>
#include <boost/asio/ssl/detail/openssl_types.hpp>

#include <boost/asio/detail/push_options.hpp>

namespace boost {
namespace asio {
namespace ssl {
namespace detail {

class openssl_init_base::do_init
{
public:
  do_init()
  {
    ::SSL_library_init();
    ::SSL_load_error_strings();        
    ::OpenSSL_add_all_algorithms();

    mutexes_.resize(::CRYPTO_num_locks());
    for (size_t i = 0; i < mutexes_.size(); ++i)
      mutexes_[i].reset(new boost::asio::detail::mutex);
    ::CRYPTO_set_locking_callback(&do_init::openssl_locking_func);
    ::CRYPTO_set_id_callback(&do_init::openssl_id_func);

#if !defined(SSL_OP_NO_COMPRESSION) \
  && (OPENSSL_VERSION_NUMBER >= 0x00908000L)
    null_compression_methods_ = sk_SSL_COMP_new_null();
#endif // !defined(SSL_OP_NO_COMPRESSION)
       // && (OPENSSL_VERSION_NUMBER >= 0x00908000L)
  }

  ~do_init()
  {
#if !defined(SSL_OP_NO_COMPRESSION) \
  && (OPENSSL_VERSION_NUMBER >= 0x00908000L)
    sk_SSL_COMP_free(null_compression_methods_);
#endif // !defined(SSL_OP_NO_COMPRESSION)
       // && (OPENSSL_VERSION_NUMBER >= 0x00908000L)

    ::CRYPTO_set_id_callback(0);
    ::CRYPTO_set_locking_callback(0);
    ::ERR_free_strings();
    ::ERR_remove_state(0);
    ::EVP_cleanup();
    ::CRYPTO_cleanup_all_ex_data();
    ::CONF_modules_unload(1);
#if !defined(OPENSSL_NO_ENGINE)
    ::ENGINE_cleanup();
#endif // !defined(OPENSSL_NO_ENGINE)
  }

#if !defined(SSL_OP_NO_COMPRESSION) \
  && (OPENSSL_VERSION_NUMBER >= 0x00908000L)
  STACK_OF(SSL_COMP)* get_null_compression_methods() const
  {
    return null_compression_methods_;
  }
#endif // !defined(SSL_OP_NO_COMPRESSION)
       // && (OPENSSL_VERSION_NUMBER >= 0x00908000L)

private:




  static unsigned long openssl_id_func()
  {
#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
    return ::GetCurrentThreadId();
#else // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
    void* id = instance()->thread_id_;                            /////// ここでエラー
    if (id == 0)
      instance()->thread_id_ = id = &id; // Ugh.                  /////// ここでエラー
    BOOST_ASIO_ASSERT(sizeof(unsigned long) >= sizeof(void*));
    return reinterpret_cast<unsigned long>(id);
#endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
  }


  #if !defined(BOOST_ASIO_WINDOWS) && !defined(__CYGWIN__)
  // The thread identifiers to be used by openssl.
  boost::asio::detail::tss_ptr<void> thread_id_;
  #endif // !defined(BOOST_ASIO_WINDOWS) && !defined(__CYGWIN__)


  // Mutexes to be used in locking callbacks.
  std::vector<boost::asio::detail::shared_ptr<boost::asio::detail::mutex> > mutexes_;

  static void openssl_locking_func(int mode, int n, 
    const char* /*file*/, int /*line*/)
  {
    if (mode & CRYPTO_LOCK)
      instance()->mutexes_[n]->lock();                  /////// ここでエラー
    else
      instance()->mutexes_[n]->unlock();                /////// ここでエラー
  }


#if !defined(SSL_OP_NO_COMPRESSION) \
  && (OPENSSL_VERSION_NUMBER >= 0x00908000L)
  STACK_OF(SSL_COMP)* null_compression_methods_;
#endif // !defined(SSL_OP_NO_COMPRESSION)
       // && (OPENSSL_VERSION_NUMBER >= 0x00908000L)
};

boost::asio::detail::shared_ptr<openssl_init_base::do_init>
openssl_init_base::instance()
{
  static boost::asio::detail::shared_ptr<do_init> init(new do_init);
  return init;
}

#if !defined(SSL_OP_NO_COMPRESSION) \
  && (OPENSSL_VERSION_NUMBER >= 0x00908000L)
STACK_OF(SSL_COMP)* openssl_init_base::get_null_compression_methods()
{
  return instance()->get_null_compression_methods();
}
#endif // !defined(SSL_OP_NO_COMPRESSION)
       // && (OPENSSL_VERSION_NUMBER >= 0x00908000L)

} // namespace detail
} // namespace ssl
} // namespace asio
} // namespace boost

#include <boost/asio/detail/pop_options.hpp>

#endif // BOOST_ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP

該当のソースコード

GET/POST機能を担当するクラスのヘッダファイル

#pragma once
#include "DxLib.h"
#include <cpprest/http_client.h>

class クラス名
{
public:
    クラス名();
    ~クラス名();
};

試したこと

例外について色々調べてみたものの、何が原因か見当が付きませんでした。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2017

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • stdio

    2019/03/11 09:58

    「メンバー○○にアクセスできません」なので、includeしているファイルが原因と思われます。
    設定を間違えただけかと思いますが今のままでは情報が不足していますね。
    もう少し詳しくエラー内容等を教えて下さい。

    キャンセル

  • hiyokko

    2019/03/11 23:35 編集

    stdio様

    回答ありがとうございます。エラーはこちらの画像(https://d.kuku.lu/9c74da9d4chttps://d.kuku.lu/ab2f763d3a)のようになっております。

    別の場所でも同様の質問をさせていただいたのですが(https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4585)、このエラーは「cpprestsdk.android」が現在の「Visual Studio 2017」に対応していないことに起因する可能性があるとのことでした。

    キャンセル

  • stdio

    2019/03/12 09:35

    対応してないなら対応しているバージョンに落とすしかないんじゃない?
    そこまでしてDXライブラリを導入しておきながら他のライブラリ入れたいのかね?
    ゲーム作るだけならDXライブラリオンリーでも何とかなるじゃない。

    キャンセル

  • hiyokko

    2019/03/12 20:42

    DXライブラリを用いたゲームに、サーバとの簡単なデータ通信機能を実装しようと考えていたところ、「C++ REST SDK」を見つけ、導入しようとした次第です。

    こちら(https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4585)の方法で、エミュレータ上ではエラー無く動いたため、一旦この質問は閉めさせていただきます。

    お忙しい中お時間を割いていただき、ありがとうございました。

    キャンセル

回答 1

check解決した方法

0

こちらを参考に環境設定をやり直したところ、x86エミュレータ上ではうまく動かすことができました。

最低限の動作が再現できたということで、一旦解決とさせていただきます。ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る