Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Проблема с 0-offset строками  [new]
Ежов Дмитрий Сергеевич
Member

Откуда: Новокузнецк-Москва, Россия
Сообщений: 94
Дня доброго.
Есть у меня приложение на Android
В нем есть java-класс, наследник Runnable, который принимает в себя, при создании параметр String.
Создается этот java -класс из NDK либы.
Вызывается через JNI.
Классик.

Далее, на основании этого параметра создается Intent и регистрируется broadcastReceiver. И все. Никаких сообщений он не перехватывает.
Однако, если туже строку задать в коде java-класса константой, тоесть:
FilterName="android.intent.action.BATTERY_CHANGED";
то все работает как часы.

Строки - идентичны, побайтово проверял.

Единственное отличие - в отладчике, когда проваливаешься в класс String, для строки, заданной константой через код, поле Offset имеет гигантское значение, а для строки, пришедшей из NDK - Offset=0.
Ну, и, если смотреть на поле value, то в константной переменной там просто тьма текста, начинающегося с "precision"

Что я не понимаю? Почему эти строки такие разные, хотя их байтовая начинка одинаковая.
11 мар 19, 14:25    [21829199]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7438
На правах идеи/бреда:

1) Можно из этой строки создать новую и ее использовать. (на Java стороне)
2) Можно для строки попытаться сделать https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern--
и пользоваться интернированной строчкой. Теоретически, интернированные строки должны быть похожи на константы из кода
(или на Java или на JNI стороне)

broadcastReceiver - я даже такого слова не слышал )))
11 мар 19, 14:32    [21829209]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4841
Ежов Дмитрий Сергеевич, а вместо броадкастресивера пробовала бэттериресивер зарегить ?
11 мар 19, 14:50    [21829232]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Ежов Дмитрий Сергеевич
Member

Откуда: Новокузнецк-Москва, Россия
Сообщений: 94
Озверин,

я события от батареи ловлю как наиболее удобно воспроизводимые в эмуляторе.
11 мар 19, 14:51    [21829236]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4841
Ежов Дмитрий Сергеевич, хз..по offset`у - абсолютно все равно, какой он. Сделано для того, чтобы можно было , к примеру, при операции выделения подстроки не создавать "новый" объект, а ссылаться на старый с нужным смещением.
11 мар 19, 14:55    [21829240]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Ежов Дмитрий Сергеевич
Member

Откуда: Новокузнецк-Москва, Россия
Сообщений: 94
Ничего не понимаю.

Есть пустое приложение. В нем есть класс ScanCode - наследник от Runnable. В этом классе есть класс TScanCodeReceiver - наследник от BroadcastReceiver. И сообщения не перехватываются.

package com.example.myapplication;

import android.arch.lifecycle.ViewModelProvider;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;


class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("CATCH", "onReceive: CATCH");
}
}

class ScanCode implements Runnable {
private Activity m_Activity;
private TScanCodeReceiver m_ScanCodeReceiver;
private String FilterName;

class TScanCodeReceiver extends BroadcastReceiver {

@Override
public void onReceive(android.content.Context curContext, android.content.Intent curIntent) {
if (curIntent.getAction() == FilterName) {
Log.i("CATCH!", "onReceive: CATCH!");
}
}
}

public ScanCode(Activity activity) {
this.m_Activity = activity;
}

public void run() {
}

public void show() {
this.m_Activity.runOnUiThread(this);
}

public void setFilterName(String name) {

this.FilterName = name;
}

public void start() {

this.m_ScanCodeReceiver = new TScanCodeReceiver();
IntentFilter filter = new IntentFilter(this.FilterName);
this.m_Activity.registerReceiver(this.m_ScanCodeReceiver, filter);

}

public void stop() {
if (this.m_ScanCodeReceiver != null) {
this.m_Activity.unregisterReceiver(m_ScanCodeReceiver);
this.m_ScanCodeReceiver = null;
}
}
}

public class MainActivity extends AppCompatActivity {
ScanCode sc;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

sc = new ScanCode(this);
sc.run();
sc.show();
sc.setFilterName("android.intent.action.BATTERY_CHANGED");
sc.start();

}
};
11 мар 19, 16:03    [21829351]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Ежов Дмитрий Сергеевич
Member

Откуда: Новокузнецк-Москва, Россия
Сообщений: 94
Но если я поменяю и вместо использования TScanCodeReceiver буду использовать внешний класс MyBroadcastReceiver - то сообщения будут перехватываться.
11 мар 19, 16:05    [21829358]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4841
Ежов Дмитрий Сергеевич, так утебя в одном случае есть проверка на имя события, а во втором - нет.
11 мар 19, 16:14    [21829373]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Ежов Дмитрий Сергеевич
Member

Откуда: Новокузнецк-Москва, Россия
Сообщений: 94
Озверин,

блин, слона то я и не приметил.
11 мар 19, 16:31    [21829412]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с 0-offset строками  [new]
Ежов Дмитрий Сергеевич
Member

Откуда: Новокузнецк-Москва, Россия
Сообщений: 94
Стоооп.
if (curIntent.getAction() == FilterName)

Всё, вкурено.
Так нельзя сравнивать строки.

Я просто новичок в Android, пришел к вам из Delphi и 1С
11 мар 19, 16:32    [21829418]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить