问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Android NDK Jni 开发C和C++的区别

发布网友 发布时间:2022-04-24 06:24

我来回答

2个回答

热心网友 时间:2022-04-12 14:57

由于Android官方NDK例子大多使用C语言编写,所以当我们想用C++进行开发时,会出现种种错误。下面简单说说几点不同之处,代码中用红色标出了不同之处:

1.先来一个用C写的例子:

(1)hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)->调用方法且方法中要传入env.

1 #include <jni.h>
2
3 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {
4 return (*env)->NewStringUTF(env,"Hello Jni---->C!");
5 }
(2)Android.mk文件,更改后缀名为.c

复制代码
1 LOCAL_PATH := $(call my-dir)
2
3 include $(CLEAR_VARS)
4
5 LOCAL_MODULE := hello
6 LOCAL_SRC_FILES := hello.c
7
8 include $(BUILD_SHARED_LIBRARY)
复制代码
2.再来一个用C++写的例子:

(1)hello.cpp文件。C++中env为一级指针,用env->调用方法,无需传入env;C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern "C"进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名;exter "C"{jni代码}。

复制代码
复制代码
1 #include <jni.h>
2
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {
7 return env->NewStringUTF("Hello Jni---->C++!");
8 }
9 #ifdef __cplusplus
10 }
11 #endif
复制代码
复制代码
(2)Android.mk文件,更改后缀名为.cpp

复制代码
1 LOCAL_PATH := $(call my-dir)
2
3 include $(CLEAR_VARS)
4
5 LOCAL_MODULE := hello
6 LOCAL_SRC_FILES := hello.cpp
7
8 include $(BUILD_SHARED_LIBRARY)

热心网友 时间:2022-04-12 16:15

由于Android官方NDK例子大多使用C语言编写,所以当我们想用C++进行开发时,会出现种种错误。下面简单说说几点不同之处,代码中用红色标出了不同之处:

1.先来一个用C写的例子:

(1)hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)->调用方法且方法中要传入env.

1 #include <jni.h>
2
3 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {
4 return (*env)->NewStringUTF(env,"Hello Jni---->C!");
5 }
(2)Android.mk文件,更改后缀名为.c

复制代码
1 LOCAL_PATH := $(call my-dir)
2
3 include $(CLEAR_VARS)
4
5 LOCAL_MODULE := hello
6 LOCAL_SRC_FILES := hello.c
7
8 include $(BUILD_SHARED_LIBRARY)
复制代码
2.再来一个用C++写的例子:

(1)hello.cpp文件。C++中env为一级指针,用env->调用方法,无需传入env;C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern "C"进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名;exter "C"{jni代码}。

复制代码
复制代码
1 #include <jni.h>
2
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {
7 return env->NewStringUTF("Hello Jni---->C++!");
8 }
9 #ifdef __cplusplus
10 }
11 #endif
复制代码
复制代码
(2)Android.mk文件,更改后缀名为.cpp

复制代码
1 LOCAL_PATH := $(call my-dir)
2
3 include $(CLEAR_VARS)
4
5 LOCAL_MODULE := hello
6 LOCAL_SRC_FILES := hello.cpp
7
8 include $(BUILD_SHARED_LIBRARY)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不想要淘宝原来的帐号,怎么办,可以注销吗~谢谢了,大神帮忙啊 蓝宝石HD6770显卡求鉴定,GPUZ检测数据如下: 健身60公斤,176身高的人,比较瘦,是不是即便经常锻炼,力气也不一定比胳膊... 农村土地什么情况不予发证?如何解决? 共工治水在前还是怒触不周山在前? 共工触山的故事 有什么类似漂流瓶的软件推荐 漂流瓶软件推荐 保险柜密码怎么改 保险柜密码正确但是打不开怎么办 西安水多少钱一顿 西安哪里可以买自来水 猪吃的东西叫什么 梦见走散了的亲人带着孙子回来了? 猪是什么东西 梦见带孙子回家并且在路上遇到好心人? java学android好还是c学android好 猪吃什么东西? 猪最主要的食物是什么? 大三在读,有一些android和C的基础,想利用空余时间学习ios和android开发,可以两个同时学吗? 梦见儿媳妇准备把孙子送回家来? 梦见儿子媳妇领着孙子回家 猪内脏有哪些? android 调用c语言包会速度更快吗 猪的那些东西是宝? 梦见孙子被人买了我抱回来了好着吗? 猪身上有什么东西? linux c 和android 选哪个啊。 猪身上有哪些“宝贝”呢?哪些东西吃了大补? 梦到儿子抱给我抱回来个孙子? 梦见儿媳妇抱着孙子回来了? C语言与安卓开发有什么关系。 猪身上 割下来的两个什么东西? Android开发环境下C/C++编程到底是什么意思? 梦见离婚儿媳妇带孙子一起回家是好是坏? 安卓开发需要什么需要c语言和java语言,用哪个? 梦见孙子光身我抱在怀中 奶奶梦见自己的孙子回来了在喊自己是什么意思? 做梦跟人打架然后抱孙子回家把孙子胳膊摔掉环了,这梦好不好? 奶奶梦见孙子带回家一捆多嫩绿的韭菜放桌上是啥意思啊? 梦见带走的孙子回家 凹蛋糕的做法,和配方图解 如何做蜂蜜凹蛋糕 怎么做蜂蜜小蛋糕呢? 装xposed框架需要ROOT吗? 安装框架一定要root吗 xp框架内怎样开启root权限? 计算机显卡算不算低成本? 我手机安装了xposed框架,结果,框架要root权限。允许后自动重启安装框 一个主机,CPU和显卡,占主机的多少钱?(输入输出设备除外) 怎么获取完整root啊,想用框架 电脑主机内各零件价格分配比例