JNIを介してJavaからCoreBluetoothを使用すると、didDiscoverCharacteristicsが呼び出されない

ニック:

MacOSでBluetooth Low Energy用のJavaインターフェースを実装しています。JNIを介してCoreBluetooth APIを呼び出します。デバイスをスキャンしてサービスに入力することはできますが、didDiscoverCharacteristicsが呼び出されていないように見えるため、特性を機能させることができません。

実行可能ファイルとして実行すると、デバイスをスキャンして接続し、そのサービス/特性をC ++に入力して印刷できます。その後、アプリは動的ライブラリとして構築され、Javaにロードできます。Javaでは、デバイスがスキャンされて正常に接続され、そのサービスを検出できます。しかし、Javaから呼び出されたときに特性が発見されることはありません。

ここでは、サービス人口のフローを示します。明確にするために、余分な部分は省略しています。

C ++:BluetoothCentralNative.cpp

// tell "macable bridge" to populate services/characteristics
macableBridge.populateServices(name, UUID);
// retreive the discovered services (with characteristics populated)
vector<vector<string>> serviceData = macableBridge.getDiscoveredServices();

Objective-C ++:MacableBridge.mm

void MacableBridge::populateServices(string name, string UUID) {
    NSString* nameString = [NSString stringWithCString:name.c_str() encoding:NSUTF8StringEncoding];
    NSString* uuidString = [NSString stringWithCString:UUID.c_str() encoding:NSUTF8StringEncoding];
    CBPeripheral* foundPeripheral = [macable findPeripheral:nameString deviceUUID:uuidString];
    [macable connectToDevice:foundPeripheral];
    [macable populateServices:foundPeripheral];
}

Objective-C:Macable.m

- (void) populateServices:(CBPeripheral *)device {
    [_swift populateServicesWithDevice:device];
    // sleep needs to be here to discover characteristics successfully as executable
    // but when we sleep, thread seems to die when calling this library from java
    sleep(1);
    // more on retrieval of populated services later
}

Swiftable.swift

@objc public func populateServices(device: CBPeripheral) {
    device.discoverServices(nil);
}

PeripheralDelegate.swift

// invoked when the peripheral's available services are discovered
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    print("\nServices discovered!\n")
    //middleman.gotServices(peripheral.services)    (more on this later)
    for service in peripheral.services! {
        peripheral.discoverCharacteristics(nil, for: service)
    }
}

// invoked when characteristics of a specified service are discovered
public func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    print("Discovered characteristics for service: \(service)")
    //middleman.gotCharacteristics(service)
}

Swiftableがすべてのサービスと特性を発見した場合にのみ、MacableでCBServicesの配列を設定してみました。MacableとSwiftableの間に「ミドルマン」を実装してみました。SwiftableのPeripheralDelegateがサービスまたはサービスの特性を検出するたびに、ミドルマンのサービスのリストが更新されます。また、すべてが実行可能ファイルとして機能しますが、Javaで.dylibを使用する場合は機能しません。

「didDiscoverCharacteristics」関数がSwiftによって呼び出されるまで、C ++、Obj-C ++、またはSwiftレイヤーを強制的に待機させる方法を知りたいのですが。whileループを使用して特性を待機すると、メインスレッドがブロックされ、プログラムは永久に実行され、決して発生しない特性の検出を待機します。また、プログラムを強制的にスリープさせると、Javaで.dylibを使用するときにスレッドが放棄されたように見えます。

デバイスとサービス人口を検出するロジックは、特徴的な検出を待つのと同じであるように見えますが、最初の2つだけが正しく機能しています。

このJSライブラリに基づいて、CoreBluetoothのAPIを非ネイティブ言語で実装できることを知っています。

更新:これはJavaの問題でした。私たちのアプリはJava 8を使用してJNIと通信していました。Java 9に更新すると、Swift側で変更を加える必要なく、問題が完全に解決されました。

sid91:

Java 8のJNIは、CoreBluetoothがスレッドを処理する方法と互換性がない場合があります。この問題は、8ではなくJDK 9を使用して解決できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Java-JNIを介してC ++から呼び出された後、エラーメッセージなしで早期に終了するプログラム

分類Dev

JXBrowserを使用してJavaScriptからJavaを呼び出すと、JAX-WS呼び出しが機能しない

分類Dev

Javaを介してspが呼び出されているときに間違った値を挿入する

分類Dev

JNIを使用してJavaから呼び出されるc ++関数で新しいJVMを作成できますか?

分類Dev

Robolectricを使用しているときにPopupWindow.OnDismissListenerが呼び出されないのはなぜですか?

分類Dev

JNIを使用してJavaからFortrandllを呼び出す

分類Dev

JNIを介してJavaで呼び出されたC DLLのメモリ使用量を監視していますか?

分類Dev

std :: bindを使用しているときにcopyctorが2回呼び出されるのはなぜですか?

分類Dev

JNIを介してJavaコードで実行すると、EGL関数の呼び出しが変わるのはなぜですか?

分類Dev

JNIを介してNode.jsからJavaを呼び出すことはできますか?

分類Dev

java.lang.IllegalStateException:BeanFactoryが初期化されていないか、すでに閉じられています-ApplicationContextを介してBeanにアクセスする前に 'refresh'を呼び出してください

分類Dev

JNI:Cからjavaメソッドを定期的に呼び出すことが機能していません

分類Dev

Facebookを介してログインするときにIOS解析PFLoginViewControllerdidLoginUser Delegateが呼び出されないのはなぜですか?

分類Dev

Facebookを介してログインするときにIOS解析PFLoginViewControllerdidLoginUser Delegateが呼び出されないのはなぜですか?

分類Dev

JNIを介してJavaから呼び出されるGo共有オブジェクトをコンパイルしようとしてエラーが発生しました

分類Dev

HaskellからFFIブロックを介して共有ライブラリを呼び出すが、Cプログラムからリンクされている場合は呼び出されない

分類Dev

mockitoを使用して配列要素をスパイすると、メソッドが呼び出されたときに必要なのに呼び出されない

分類Dev

SocketCAN bind()呼び出しがJNIから呼び出されたときに常に0を返すのはなぜですか?

分類Dev

getElementsByClassNameを使用するとinnerHTMLが呼び出されない

分類Dev

JSは、関数を呼び出すか呼び出さないかによって異なる反応を示します(google maps apiが使用されます)

分類Dev

論理演算子を介して呼び出される関数で「これ」が定義されていないのはなぜですか?

分類Dev

宣言されていない変数を使用してファンクターを呼び出すことが機能するのはなぜですか?

分類Dev

Androidでカメラを呼び出しているときに、アクティビティ内のすべての変数(Activity1からインテントを介して取得)が再初期化されるのはなぜですか?

分類Dev

別のスレッドからJNIを介して保存されたJavaオブジェクトを呼び出す

分類Dev

cronを介してURLを呼び出しているときに不要なテキストファイルが作成されています

分類Dev

Mockを使用して関数/メソッドが呼び出されなかったことを表明する

分類Dev

Mockを使用して関数/メソッドが呼び出されなかったことを表明する

分類Dev

Dockerを使用してNuxtをデプロイすると、環境変数が登録されず、予期しないAPI呼び出しが発生しますか?

分類Dev

Crontabは、Python subPrrocessを介して使用されるmailxを呼び出すことができません

Related 関連記事

  1. 1

    Java-JNIを介してC ++から呼び出された後、エラーメッセージなしで早期に終了するプログラム

  2. 2

    JXBrowserを使用してJavaScriptからJavaを呼び出すと、JAX-WS呼び出しが機能しない

  3. 3

    Javaを介してspが呼び出されているときに間違った値を挿入する

  4. 4

    JNIを使用してJavaから呼び出されるc ++関数で新しいJVMを作成できますか?

  5. 5

    Robolectricを使用しているときにPopupWindow.OnDismissListenerが呼び出されないのはなぜですか?

  6. 6

    JNIを使用してJavaからFortrandllを呼び出す

  7. 7

    JNIを介してJavaで呼び出されたC DLLのメモリ使用量を監視していますか?

  8. 8

    std :: bindを使用しているときにcopyctorが2回呼び出されるのはなぜですか?

  9. 9

    JNIを介してJavaコードで実行すると、EGL関数の呼び出しが変わるのはなぜですか?

  10. 10

    JNIを介してNode.jsからJavaを呼び出すことはできますか?

  11. 11

    java.lang.IllegalStateException:BeanFactoryが初期化されていないか、すでに閉じられています-ApplicationContextを介してBeanにアクセスする前に 'refresh'を呼び出してください

  12. 12

    JNI:Cからjavaメソッドを定期的に呼び出すことが機能していません

  13. 13

    Facebookを介してログインするときにIOS解析PFLoginViewControllerdidLoginUser Delegateが呼び出されないのはなぜですか?

  14. 14

    Facebookを介してログインするときにIOS解析PFLoginViewControllerdidLoginUser Delegateが呼び出されないのはなぜですか?

  15. 15

    JNIを介してJavaから呼び出されるGo共有オブジェクトをコンパイルしようとしてエラーが発生しました

  16. 16

    HaskellからFFIブロックを介して共有ライブラリを呼び出すが、Cプログラムからリンクされている場合は呼び出されない

  17. 17

    mockitoを使用して配列要素をスパイすると、メソッドが呼び出されたときに必要なのに呼び出されない

  18. 18

    SocketCAN bind()呼び出しがJNIから呼び出されたときに常に0を返すのはなぜですか?

  19. 19

    getElementsByClassNameを使用するとinnerHTMLが呼び出されない

  20. 20

    JSは、関数を呼び出すか呼び出さないかによって異なる反応を示します(google maps apiが使用されます)

  21. 21

    論理演算子を介して呼び出される関数で「これ」が定義されていないのはなぜですか?

  22. 22

    宣言されていない変数を使用してファンクターを呼び出すことが機能するのはなぜですか?

  23. 23

    Androidでカメラを呼び出しているときに、アクティビティ内のすべての変数(Activity1からインテントを介して取得)が再初期化されるのはなぜですか?

  24. 24

    別のスレッドからJNIを介して保存されたJavaオブジェクトを呼び出す

  25. 25

    cronを介してURLを呼び出しているときに不要なテキストファイルが作成されています

  26. 26

    Mockを使用して関数/メソッドが呼び出されなかったことを表明する

  27. 27

    Mockを使用して関数/メソッドが呼び出されなかったことを表明する

  28. 28

    Dockerを使用してNuxtをデプロイすると、環境変数が登録されず、予期しないAPI呼び出しが発生しますか?

  29. 29

    Crontabは、Python subPrrocessを介して使用されるmailxを呼び出すことができません

ホットタグ

アーカイブ