Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
_Night_Scream_
77 / 75 / 8
Регистрация: 08.08.2013
Сообщений: 621
#1

Вызов java метода из native - Программирование Android

07.01.2017, 12:43. Просмотров 464. Ответов 6

Привет, чтот не пойму зачем у меня ошибка происходит...

Значит что хочу и что происходит.
Есть активити с TextView и кнопкой.
В TextView выводится текст из C++ функции stringFromJNI, всё выводит, всё работает.
По кнопке я вызываю метод из С++ RunMyCode в котором хочу найти java метод (helloWorld) и его вызвать.
В общем нахожу класс, метод, перед вызовом кидаю лог, лог приходит а при выхове получаю ошибку

system_process E/InputDispatcher: channel '4a9d792... .test.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

вот java

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }
 
    static {
        System.loadLibrary("native-lib");
    }
   
    public native String stringFromJNI();
    public native void RunMyCode();//этот метод вызовит из натив helloWorld
 
 
    public void helloWorld(boolean b){//ЭТОТ МЕТОД ХОЧУ ВЫЗВАТЬ
        Log.d("LOG","helloWorld: " + b);//ТУТ НЕ СРАБОТАЕТ
    }
 
    public void RunCode(View v){//нажатие на кнопку, которое вызывает native код
        Log.d("LOG","вызов native по кнопке");
        RunMyCode();//native
    }
}
Вот native

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <jni.h>
#include <string>
#include <android/log.h>
 
// Android log function wrappers
static const char* kTAG = "LOG";
#define LOGI(...) \
  ((void)__android_log_print(ANDROID_LOG_INFO, kTAG, __VA_ARGS__))
#define LOGW(...) \
  ((void)__android_log_print(ANDROID_LOG_WARN, kTAG, __VA_ARGS__))
#define LOGE(...) \
((void)__android_log_print(ANDROID_LOG_ERROR, kTAG, __VA_ARGS__))
 
extern "C" {
    JNIEXPORT jstring JNICALL
    Java_ru_himik_nightscream_test_MainActivity_stringFromJNI(JNIEnv *env, jobject mainClass) {
        jstring hello = (jstring) "Это работает";
        return env->NewStringUTF((const char *) hello);
    }
 
    JNIEXPORT void JNICALL
    Java_ru_himik_nightscream_test_MainActivity_RunMyCode(JNIEnv *env, jobject mainClass) {
        jclass mainActivity = env->GetObjectClass(mainClass);
        jmethodID sendTimeID = env->GetMethodID(mainActivity, "helloWorld", "(Z)V");
        LOGI("sendTimeID: %d", sendTimeID);//выводит != 0, значит метод существует
        env->CallVoidMethod(mainActivity, sendTimeID, (jboolean) false);
    }
}
Пересмотрел пару десятков примеров, всё фигня, не робит и всё.
Да и в основном примеры старые, где надо было использовать Android.mk, сейчас гугл говорит надо CMake использовать в новых проектах, сам гугл только как месяц обновил примеры, но там куча не нужного и еще куча багов.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2017, 12:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызов java метода из native (Программирование Android):

Вызов метода в onCreate() - Программирование Android
Здравствуйте.Пытаюсь загружать сохраненные данные при старте приложения и сохранять при выходе с помощью Preferences. Добавлял написанные...

Вызов метода из другого класса - Программирование Android
Не могу разобраться, почему вылетает приложение, когда пытаюсь задать текст для TextView в MainActivity из другого класса. Подскажите...

Вызов метода из другого Activity - Программирование Android
Здраствуйте. Помогите,пожалуйста, разобраться с несколькими вопросами: 1) Правильно ли, что &quot;Настройки&quot; я выделил в отдельный Activity ...

Вызов метода из класса в таймере - Программирование Android
Не могу получить титул веб страницы в таймере (ошибка). Пример: public class Main_Web extends WebView { String texst =...

Вызов метода при прокрутке activity - Программирование Android
Как обработать событие когда activity прокрутили в самый низ что бы вызвать какой нибудь метод? Например как новости в ВК при прокрутке...

Вызов нестатического метода из другого класса - Программирование Android
Здравствуйте. Подскажите, как можно вызвать нестатистический метод из другого класса. 1.Этот другой класс нельзя наследовать тем...

6
hemoa
-1 / 5 / 0
Регистрация: 22.11.2016
Сообщений: 68
08.01.2017, 02:48 #2
всё фигня, не робит и всё.
вот раз "и все" то есть отлаживать ты не умеешь

Да и в основном примеры старые, где надо было использовать Android.mk, сейчас гугл говорит надо CMake использовать в новых проектах
первый раз слышу. всегда с JNI использую Android.mk, затем ndk-build. что там говорит гугл я плевать хотел, раз надо Android.mk то и используй
0
EVP
489 / 257 / 44
Регистрация: 14.12.2010
Сообщений: 515
08.01.2017, 12:57 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Попробуй так 26ую строчку:
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
env->CallVoidMethod(mainClass, sendTimeID, (jboolean) false);
1
_Night_Scream_
77 / 75 / 8
Регистрация: 08.08.2013
Сообщений: 621
08.01.2017, 14:32  [ТС] #4
hemoa,
иди читай https://developer.android.com/ndk/guides/index.html

Добавлено через 12 минут
hemoa,
Android Studio's default build tool for native libraries is CMake. Android Studio also supports ndk-build due to the large number of existing projects that use the build toolkit to compile their native code. If you want to import an existing ndk-build library into your Android Studio project, see the section about how to configure Gradle to link to your native library. However, if you are creating a new native library, you should use CMake.

Цитата Сообщение от hemoa Посмотреть сообщение
первый раз слышу. всегда с JNI использую Android.mk, затем ndk-build. что там говорит гугл я плевать хотел, раз надо Android.mk то и используй и не ипи мозг
это всё объясняет....

Добавлено через 1 час 8 минут
EVP, да, в этом трабла, я вчера обратил внимание но чет запоролся потом.
У меня такой вопрос
Конечно у меня включена обфускация, и после её метод будет не "helloWorld" а какой то другой a,ab,abz и т.д.
Как мне выполнить этот метод из native, как найти?
0
EVP
489 / 257 / 44
Регистрация: 14.12.2010
Сообщений: 515
08.01.2017, 14:46 #5
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
Конечно у меня включена обфускация, и после её метод будет не "helloWorld" а какой то другой a,ab,abz и т.д.
Как мне выполнить этот метод из native, как найти?
Не надо обфусцировать вызываемый метод.
Нужно дабавить правила в proguard-rules.pro:
C
1
2
3
4
5
6
7
8
9
10
11
-keepclasseswithmembernames class * {
    native <methods>;
}
 
-keep class ru.himik.nightscreeam.test.MainActivity {
    private void hellowWorld();
}
 
-keepclasseswithmembernames class ru.himik.nightscreeam.test.MainActivity {
    private void hellowWorld();
}
1
_Night_Scream_
77 / 75 / 8
Регистрация: 08.08.2013
Сообщений: 621
08.01.2017, 15:01  [ТС] #6
EVP, ага, я не знал что можно оставить методы которые хочу, думал целиком класс указывается, спасибо.
я думаю мне нужный метод переименовать в abz самому и пропустить его при обфускации, получится мнение при раскрытии что все методы обфусцированы.

ну если не сложно еще один вопрос, долго меня мучает
сейчас есть программа, в ней всё на java, одни методы вызывают другие
я хочу спрятать вызов некоторых методов класса через native уровень
эти вызовы из native будут работать в том же потоке и фактически разницы не будет для приложения откуда я вызвал этот метод (helloWorld) из native или из java?
0
EVP
489 / 257 / 44
Регистрация: 14.12.2010
Сообщений: 515
08.01.2017, 15:08 #7
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
я хочу спрятать вызов некоторых методов класса через native уровень
эти вызовы из native будут работать в том же потоке и фактически разницы не будет для приложения откуда я вызвал этот метод (helloWorld) из native или из java?
При переходе через границу JNI поток не меняется.
Если в методах нет работы с другим потоком, то синхронизация не нужна.
1
08.01.2017, 15:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 15:08
Привет! Вот еще темы с ответами:

Вызов метода при каждом открытии приложения - Программирование Android
Мне нужно, что бы при открытии приложения вызывался определенный метод. Если ставлю в onCreate, то вызов его происходит только если все...

Вызов метода перед завершением работы приложения - Программирование Android
Вопрос такой, есть ли какой-нибудь метод, который можно перегрузить и который будет вызываться перед закрытием программы ? (например для...

Где хранятся static переменные метода в java - Программирование Android
Подскажите пожалуйста, где хранятся локальные переменные static метода в java

Limit of one JavaVM native code - Программирование Android
Помогите пожалуйста разобраться. Читаю этот гайд(https://developer.android.com/training/articles/perf-jni.html) по нативной разработке. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru