JNI将C更改为C++

dil*_*lix 4 java-native-interface android android-ndk

我有一段简单的代码,我想在我的java(android)应用程序中使用:

#include <string.h>
#include <jni.h>

jstring 
Java_com_example_ndk_MainActivity_stringFromJNI( JNIEnv* env,
                                                  jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Run Code Online (Sandbox Code Playgroud)

如果我使用C并调用此文件*.c - 一切正常,但我想在C++上使用此代码,我将此文件重命名为*.cpp(并更改Android.mk).一切都被编译但是当我尝试以我在C中使用它的方式使用此函数时,我有一个错误.

*我也修改了func的主体:

    return env->NewStringUTF("Hello from JNI !");
Run Code Online (Sandbox Code Playgroud)

试着用这个:

public native String stringFromJNI();

static {
    System.loadLibrary("hello-jni");
}
Run Code Online (Sandbox Code Playgroud)

并得到这样一个错误:

09-10 17:55:46.410: W/dalvikvm(6339): No implementation found for native Lcom/example/ndk/MainActivity;.stringFromJNI ()Ljava/lang/String;


09-10 17:55:46.410: E/AndroidRuntime(6339): java.lang.UnsatisfiedLinkError: stringFromJNI
09-10 17:55:46.410: E/AndroidRuntime(6339):     at com.example.ndk.MainActivity.stringFromJNI(Native Method)
09-10 17:55:46.410: E/AndroidRuntime(6339):     at com.example.ndk.MainActivity.onCreate(MainActivity.java:22)
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么相同的代码在C中运行并且在C++中失败(运行时).

Som*_*ude 19

为了允许函数重载,C++使用名为mangling的东西.这意味着C++中的函数名称与普通C中的函数名称不同.

要禁止此名称修改,您必须将函数声明为extern "C":

extern "C" jstring 
Java_com_example_ndk_MainActivity_stringFromJNI( JNIEnv* env,
                                                 jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Run Code Online (Sandbox Code Playgroud)