Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
_Night_Scream_
78 / 76 / 10
Регистрация: 08.08.2013
Сообщений: 630
#1

Вызов java метода из native

07.01.2017, 12:43. Просмотров 1035. Ответов 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
Ответы с готовыми решениями:

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

Вызов метода по таймеру
Здравствуйте, подскажите пожалуйста, почему при повторном нажатии таймер не...

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

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

Вызов метода из класса в таймере
Не могу получить титул веб страницы в таймере (ошибка). Пример: public...

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
492 / 260 / 58
Регистрация: 14.12.2010
Сообщений: 524
08.01.2017, 12:57 #3
Лучший ответ Сообщение было отмечено _Night_Scream_ как решение

Решение

Попробуй так 26ую строчку:
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
env->CallVoidMethod(mainClass, sendTimeID, (jboolean) false);
1
_Night_Scream_
78 / 76 / 10
Регистрация: 08.08.2013
Сообщений: 630
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
492 / 260 / 58
Регистрация: 14.12.2010
Сообщений: 524
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_
78 / 76 / 10
Регистрация: 08.08.2013
Сообщений: 630
08.01.2017, 15:01  [ТС] #6
EVP, ага, я не знал что можно оставить методы которые хочу, думал целиком класс указывается, спасибо.
я думаю мне нужный метод переименовать в abz самому и пропустить его при обфускации, получится мнение при раскрытии что все методы обфусцированы.

ну если не сложно еще один вопрос, долго меня мучает
сейчас есть программа, в ней всё на java, одни методы вызывают другие
я хочу спрятать вызов некоторых методов класса через native уровень
эти вызовы из native будут работать в том же потоке и фактически разницы не будет для приложения откуда я вызвал этот метод (helloWorld) из native или из java?
0
EVP
492 / 260 / 58
Регистрация: 14.12.2010
Сообщений: 524
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

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

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

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


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

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

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