Я пытаюсь вызвать функцию Java из своего кода на С++, но приложение продолжает «зависать».
Сначала я запускаю код C++ через вызов JNI, который работает без проблем. Затем я позволяю функции, которая вызывается, выполнять обратный вызов:
#include <jni.h>
extern "C"
JNIEXPORT jstring JNICALL
Java_net_example_folder_Service_startSomething(JNIEnv *env, jobject obj) {
invoke_class(env);
return env->NewStringUTF("The End.\n"); //works if I only use this line
}
Попытка подписаться на http://www.inonit.com/cygwin/jni/invocationApi/c.html (и множество других руководств/советов и т. д.), я использую это для вызова функции java:
void invoke_class(JNIEnv* env) {
jclass helloWorldClass;
jmethodID mainMethod;
helloWorldClass = env->FindClass("Java/net/example/folder/helloWorldClass");
mainMethod = env->GetStaticMethodID(helloWorldClass, "helloWorld", "()V");
env->CallStaticVoidMethod(helloWorldClass, mainMethod);
}
Чтобы вызвать код Java:
package net.example.folder;
import android.util.Log;
public class helloWorldClass {
public static void helloWorld() {
Log.e("helloWorldCLass", "Hello World!");
}
}
Код С++ вызывается фоновой службой. Вот функция Activity, которая его запускает:
public void startService() {
Intent i = new Intent(this, Service.class);
startService(i);
}
А это часть Сервиса:
public class SimService extends IntentService {
...
@Override
protected void onHandleIntent(Intent intent) {
System.loadLibrary("native-lib");
startSomething();
}
}
Все это работает, но когда я теперь изменяю функцию «invoke_class» на:
void invoke_class(JNIEnv* env) {
jclass helloWorldClass;
jmethodID mainMethod;
helloWorldClass = env->FindClass("net/example/folder/helloWorldClass");
mainMethod = env->GetStaticMethodID(helloWorldClass, "helloWorld", "([Ljava/lang/String;)V");
env->CallStaticVoidMethod(helloWorldClass, mainMethod, env->NewStringUTF("some text"));
}
и, конечно же, java-часть:
package net.example.folder;
import android.util.Log;
public class helloWorldClass {
public static void helloWorld(String msg) {
Log.e("helloWorldCLass", msg);
}
}
С этим я получу ранее упомянутый сбой.
Это почему? Как правильно передать аргументы?
[
используется для представления массивов (как если бы у вас было String[] msg), удалите это из вашего методаGetStaticMethodID
. - person Dmitrii Z.   schedule 01.04.2018[
работает. Ошибка проверки типаif(mainMethod != 0)
и запуск кода только после этого? Это все равно приведет к сбою моего приложения из-за некоторой ошибки JNI. - person janonymous   schedule 01.04.2018