Опитвам се да извикам java функция от моя c++ код, но приложението продължава да се „срива“.
Първоначално стартирам 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!");
}
}
C++ кодът се извиква от фонова услуга. Ето функцията на дейността, която я стартира:
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