Android ndk 如何调用java函数并从c++;使用androidndk 我尝试从我的C++代码调用java函数,但是应用程序保持“崩溃”。 首先,我通过JNI调用启动C++代码,它没有任何问题。然后让被调用的函数执行回调: #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 }
要调用java代码:Android ndk 如何调用java函数并从c++;使用androidndk 我尝试从我的C++代码调用java函数,但是应用程序保持“崩溃”。 首先,我通过JNI调用启动C++代码,它没有任何问题。然后让被调用的函数执行回调: #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 },android-ndk,java-native-interface,Android Ndk,Java Native Interface,要调用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() {
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);
}
}
有了这些,我将得到前面提到的崩溃
为什么呢?如何正确传递参数?Symbol
[
用于表示数组(就好像您有字符串[]msg),请从GetStaticMethodID方法中删除它
您可以查看有关的更多信息
正如Michael所说,您应该检查本机代码中的java异常,否则您的应用程序将崩溃。您可以使用。例如:
jclass exClass = env->FindClass("some/random/class");
if (exClass == nullptr || env->ExceptionOccurred()) {
env->ExceptionClear();
// do smth in case of failure
}
符号
[
用于表示数组(就好像您有字符串[]msg),请从GetStaticMethodID方法中删除它
您可以查看有关的更多信息
正如Michael所说,您应该检查本机代码中的java异常,否则您的应用程序将崩溃。您可以使用。例如:
jclass exClass = env->FindClass("some/random/class");
if (exClass == nullptr || env->ExceptionOccurred()) {
env->ExceptionClear();
// do smth in case of failure
}
[
用于表示数组(就像您有字符串[]msg一样),将其从GetStaticMethodID
方法中删除。当然,还要为所有JNI调用添加错误检查。不要只是假设它们会成功。谢谢,如果没有[
它会工作。错误检查类似于if(main method!=0)
然后才运行代码?它仍然会导致我的应用程序崩溃,因为一些“JNI错误”[
用于表示数组(就像您有字符串[]msg一样),将其从您的GetStaticMethodID
方法中删除。当然,还要为所有JNI调用添加错误检查。不要只是假设它们会成功。谢谢,如果没有[
,它会起作用。错误检查如if(mainMethod!=0)
,然后才运行代码?由于某些原因,它仍然会导致我的应用程序崩溃如果类/方法不存在或找不到,则“JNI Error”EXOPERSS的值为NULL。至少在我的情况下是这样。因此如果(EXOPERSS==NULL | | |…)对我来说是这样。如果类/方法不存在或找不到,EXOPERSS的值为NULL。至少在我的情况下是这样。如果(EXOPERSS==NULL | |…)对我来说是这样。