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)
| 归档时间: |
|
| 查看次数: |
6074 次 |
| 最近记录: |