android底层开发系列helloworld
来源:互联网 发布:华宇软件股票 编辑:程序博客网 时间:2024/05/16 10:24
为供Java调用的c++函数前加入extern "C" 修饰,如:(NDK example里面的cpp文件也是这么声明的,参考hello-gl2)
原因是:
被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。
首先看看C++中对类似C的函数是怎样编译的:作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数voidfoo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。
因此,若我们没有使用extern "C"修饰函数,按照C语言方式编译和连接,Jni调用将可能找不到该函数。
#include <jni.h>#include <string.h>extern "C" { JNIEXPORT jstring JNICALL Java_com_example_jtest_MainActivity_test( JNIEnv* env, jobject thiz );}JNIEXPORT jstring Java_com_example_jtest_MainActivity_test( JNIEnv* env,jobject thiz ){ return env->NewStringUTF("Hello from JNI ! Compiled with ABI " );}
- android底层开发系列helloworld
- Android系列之HelloWorld
- Android Studio系列-HelloWorld
- Android应用开发系列(2)——HelloWorld, APK生成
- ANDROID 底层 NDK 开发
- Android底层开发
- android底层开发
- android 底层开发例子
- ANDROID底层开发
- android底层开发
- Android底层开发经验
- Android开发第一步:HelloWorld
- JertBrains 开发android HelloWorld
- Android中间件开发----helloworld
- android开发以及HelloWorld
- 【Android开发】- HelloWorld
- android-ndk开发helloworld
- 强烈推荐Android开发技术系列文,android底层架构,android核心框架
- Linux Mysql 5.5 X64位安装,个人实践
- 有什么方法快速的将小硬盘对拷到大硬盘
- WPF 如何在文本外面加虚线外框
- 企业证书APP发布流程
- 微信生成二维码
- android底层开发系列helloworld
- C++构造函数为什么不能是虚函数
- 一步一步学linux多线程编程
- BZOJ 3203 Sdoi2013 保护出题人 凸包+三分
- DVWA安装
- 安卓编译系统简介
- Step into Gradle - 06 - 文件管理
- WPF 颜色
- 如何产生一个从x到y的k个随机数 Random(int x,int y ,int k)