您的位置:首页 > 其它

JNI调用错误: No implementation found for native

2016-05-05 13:02 429 查看
JNI 调用时,一直报 No implementation found for native 以及编译时提示找不到undefined refercen

有一个可能是,如果调用的是C++的代码,必须加extern "C"

【转】 jni 调用c和c++的区别.

1、JNIEnv *env参数的使用

所有JNI接口的第一个参数是JNIEnv *env, 在C中,使用方法是

(*env)->NewStringUTF(env, "Hello from JNI!");

但在C++中,其调用方法是

env->NewStringUTF("Hello from JNI!");

为什么有这种区别呢,看看jni.h中关于JNIEnv的定义就可以知道了:

#if defined(__cplusplus)

typedef _JNIEnv JNIEnv;

#else

typedef const struct JNINativeInterface* JNIEnv;

#endif

可以看到,对于C和C++,定义有所不同,主要原因是C不支持类,所以采用了一种变通的方法。

2、接口找不到

在Java中调用JNI接口时,出现异常,察看日志,发现有如下错误:

WARN/dalvikvm(422): No implementation found for native Lcom/whty/wcity/HelixPlayer;.setDllPath (Ljava/lang/String;)V

检查了几遍代码,Cpp中确实定义了这个接口,而且仔细对照了Java的包名、类名,确实没有错误,那为什么会出现这种问题呢。后来突然想到,JNI接口 都是以C的方式定义的,现在使用C++实现,函数定义前是否需要加上extern "C"呢?为此定义了一个头文件,在CPP文件中include该头文件,头文件加上如下代码片断:

#ifdef __cplusplus

extern "C" {

#endif

#endif

...

#ifdef __cplusplus

}

再次尝试,调用成功!

单个文件:

  g++ file.cpp

  这是最简单形式,缺省输出为a.out,可以用-o命令指定输出文件,比如g++ file.cpp f.out

  多个文件:

  g++ -c 1.cpp -o 1.o

  g++ -c 2.cpp -o 2.o

  g++ 1.o 2.o -o prog.out

  链接成可执行文件:

  一般用g++ -o file file.cpp

  多个文件是g++ -o file file1.cpp file2.cpp

  编译C++不是用GCC而是G++.

  如果用GCC能编译但不能链接.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: