Android(安卓)Studio开发NDK用C++的坑
16lz
2021-01-26
开发带有NDK(不是纯原生)的项目的时候,IDE会关联javah插件,自动生成native方法定义的头文件,头文件命名为完整包路径以下划线连接,文件内容格式如下(摘自某博友):
然后再自定义任意名字的c文件,包含头文件和jni.h,并实现头文件定义的方法。 经本人测试,如果用C开发本地方法,这个流程没有问题。但是如果要用C++开发本地方法,单纯把c文件后缀改为cpp,打包编译正常,但是运行永远会报cannot find implementation of your native method.为什么?内部原理我无法十分清楚,但是看样子,链接执行的时候,JNI根据头文件的方法定义,应该是默认到c文件找实现,当只有cpp文件而没有c文件的时候就找不到实现方法了。但是so文件应该是没有问题的,因为编译是按照Android.mk定义的 LOCAL_SRC_FILES寻找打包源文件的。IDE的编译链接部分对程序员透明,这里我也不清楚,如果有哪位读者了解,还希望不吝赐教。
如果用C++开发本地方法,删掉IDE自动生成的头文件,直接用cpp文件实现所有本地方法,在代码外围加上如下的部分:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_example_yourjavaclassname */
#ifndef _Included_com_example_yourjavaclassname
#define _Included_com_example_yourjavaclassname
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_yourjavaclassname
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_yourjavaclassname_getString
(JNIEnv *, jclass);
/*
* Class: com_example_yourjavaclassname
* Method: plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_yourjavaclassname_plus
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
然后再自定义任意名字的c文件,包含头文件和jni.h,并实现头文件定义的方法。 经本人测试,如果用C开发本地方法,这个流程没有问题。但是如果要用C++开发本地方法,单纯把c文件后缀改为cpp,打包编译正常,但是运行永远会报cannot find implementation of your native method.为什么?内部原理我无法十分清楚,但是看样子,链接执行的时候,JNI根据头文件的方法定义,应该是默认到c文件找实现,当只有cpp文件而没有c文件的时候就找不到实现方法了。但是so文件应该是没有问题的,因为编译是按照Android.mk定义的 LOCAL_SRC_FILES寻找打包源文件的。IDE的编译链接部分对程序员透明,这里我也不清楚,如果有哪位读者了解,还希望不吝赐教。
如果用C++开发本地方法,删掉IDE自动生成的头文件,直接用cpp文件实现所有本地方法,在代码外围加上如下的部分:
#ifdef __cplusplus
extern "C" {
#endif
......
#ifdef __cplusplus这样就正常了!!!!
}
#endif
更多相关文章
- android打包so文件到apk
- Android之数据存储笔记
- [Android] Linux下查看apk文件程序包名的办法
- 解决android sdk manage打开闪退的解决方法
- Android开发中遇到的几个问题及解决方案
- Mac系统下Android(安卓)SDK更新以及ADT无法在线下载
- MAC android studio 新建hollowerd 提示:install bool 19.1.0解决
- Android(安卓)多渠道定制化打包
- android eclipse NDK 测试hello-jni ,HelloJni/jni/hello-jni.c提