开发带有NDK(不是纯原生)的项目的时候,IDE会关联javah插件,自动生成native方法定义的头文件,头文件命名为完整包路径以下划线连接,文件内容格式如下(摘自某博友):
   

/* 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
这样就正常了!!!!

更多相关文章

  1. android打包so文件到apk
  2. Android之数据存储笔记
  3. [Android] Linux下查看apk文件程序包名的办法
  4. 解决android sdk manage打开闪退的解决方法
  5. Android开发中遇到的几个问题及解决方案
  6. Mac系统下Android(安卓)SDK更新以及ADT无法在线下载
  7. MAC android studio 新建hollowerd 提示:install bool 19.1.0解决
  8. Android(安卓)多渠道定制化打包
  9. android eclipse NDK 测试hello-jni ,HelloJni/jni/hello-jni.c提

随机推荐

  1. 对话框式activity
  2. 在Android中支持表情
  3. android 竖屏activity跳转横屏activity返
  4. Android ListView在TalkBack下有些项无法
  5. 探讨相对布局的重要特性和属性
  6. Ubuntu 下配置使用Android adb
  7. Android点击其他地方隐藏键盘
  8. Android自定义相机,切换前后摄像头,照相
  9. /system/bin/service分析与使用
  10. Android(安卓)TabHost的使用(一)