当前位置:首页 » 安卓系统 » androidcpp

androidcpp

发布时间: 2022-10-14 22:06:09

A. 请问有android开发环境的cpp编译器吗

编译bootloader和linux Kernel是采用的是独立的ARM交叉编译器,可以在 \10.4.69.249androidepoarm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 获得。编译Android根文件系统和SDK使用的是Android系统自带的交叉编译环境。
使用如下命令安装交叉编译器,建议安装在 /usr/local/ 目录下(需具有root权限)。
[root]$ cd /usr/local/
[root]$ tar xjvf /arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
将交叉编译器的路径添加到对应用户名的.bash_profile 文件中。
[root]$ cd
[root]$ vim .bash_profile
修改其中的PATH一行,在末尾增加交叉编译器的路径,例如:
PATH=$PATH:/usr/local/bin/arm-2008q3/bin
运行如下命令检查交叉编译器是否安装成功,得到如下结果表示安装已经成功。
[root]$ arm-none-linux-gnueabi-gcc ?version
arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2008q3-72) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

B. android用cmake怎么导入cpp文件夹,undifined reference to

ndroid Studio升级到2.2之后,我们可以先配置好NDK开发的一些所需工具,如图,在SDK Tools中勾选安装CMake、LLDB、NDK。

CMake: 外部构建工具。如果你准备只使用 ndk-build 的话,可以不使用它。
LLDB: Android Studio上面调试本地代码的工具。
Android Studio自带DEMO了解CMAKE
Android Studio升级到2.2版本之后,在创建新的project时,界面上多了一个Include C++ Support的选项。勾选它之后将会创建一个默认的C++与java混编的Demo程序。就让我们先来看看这个官方标准Demo吧。
开始之前最好先下载好NDK,见NDK开发 从入门到放弃(一:基本流程入门了解),即在Project Structure界面Android NDK location处下载或选择正确的路径。或者使用上方提供的工具安装方法来进行下载。否则,创建的新project也会报错,需要配置好后clean。
File -> New -> New Project,在如下界面中勾选Include C++ Support,然后一路 Next,直到 Finish 为止即可。

项目打开后我们查看目录结构,与常规项目不同的是多了.externalNativeBuild文件夹、cpp文件夹、CMakeLists.txt文件,如下图:

这三个东西都是NDK部分:
1. .externalNativeBuild文件夹:cmake编译好的文件, 显示支持的各种硬件等信息。系统生成。
2. cpp文件夹:存放C/C++代码文件,native-lib.cpp文件是该Demo中自带的,可更改。需要自己编写。
3. CMakeLists.txt文件:CMake脚本配置的文件。需要自己配置编写。
Gradle中也有两处不同:

java代码:
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}

/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();

// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
}2223

从native-lib.cpp的代码中我们能看到它使用的是静态注册的方式,动态注册的方式代码同传统JNI。
#include <jni.h>
#include <string>

extern "C"
jstring
Java_com_example_person_myapplication_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}12345678910111234567891011

CMakeLists.txt文件中我们需要注意的是下面这三个地方。两个library的名字(需一致)以及一个cpp文件的路径,彼此需要对应一致,当我们自己定义library以及自己创建cpp文件时需要对应修改。

C. 关于ANDROID和NDK:外部的CPP文件如何通过NDK编译成so文件。

eclipse配置NDK环境

D. android调试cpp代码时,报错:Target selection failed.localhost:5039:有大侠给帮忙解决下么

调试时,没选择目标

E. 为啥Android下用到的.cpp中的sizeofwchar

晕,打个回车,结果发表了。我重新叙述下问题。我的android工程要用到C++代码。在cygwin下gdb调试时发现sizeof(wchar_t)的结果是4,我看网上说是可以通过-fshort-wchar 来解决,于是我在mk文件中加入了下面这句话 LOCAL_CPP_FLAGS := -fshort-wchar 但是调试时发现还是占用4个字节。而在 Cygwin下通过vi ,新建一个.cpp文件,里面cout << sizeof(wchar) << endl; 得出的结果却是2。 求解,先谢谢啦 查看原帖>>

F. 如何让工程调用的是android的.cpp而不是调用的cocos2dx的.cpp

cocos2d-x在win32上开发出来的代码还需要交叉编译后才能生成android可以使用的包,具体操作见这个文档 另:使用cocos2d-x引擎的优势在于便于移植性。其开发出的C++代码只要在各上只要稍加改动就可以使用。

G. 用gcc/g++如何编译android工程中的.c/.cpp程序,如何查看android工程师.c/.cpp文件需要的依赖及如何解决

目前暂不支持开发工具编译C、c++代码生成so文件,应该后续版本会有的。.so 为共享库,是shared object,用于动态连接的,和dll差不多,可以这样调用so文件:得到/usr/java/jdk1.5.0_13/jre/lib/i386,将SO文件放在该目录下运行java程序,输出了由C语言函数计算出的结果以引擎自带的HelloCpp为例配置C++的的自动编译。在eclipse中导入hellocpp工程。操作路径:eclipse--file--import工程导入后,右击工程--properties取消CDT builder。然后点击New新建一个我们自己的builder,选择program。指定ndk-build.cmd来编译我们的项目,下面的工作路径将作为参数传入给ndk-build.cmd添加NDK_MODULE_PATH变量,注意要写两个路径[cocos2d-x安装目录和其目录下\cocos2dx\platform\third_party\android\prebuilt],用分号分开最后点OK保存。因为不是执行build_native.sh编译本地代码,所以别忘了手动拷贝下hellocpp工程下resource中的资源到android工程assets.可以在命令行下编译多个C/CPP文件,通过cl -c命令来编译类文件,编译成obj文件后,你可以使用lib命令将其编译为lib文件,然后使用link命令连接多个obj文件。默认生成的可执行文件的名称是命令中第一个obj文件的名称,具体参考代码如下:

H. 如何调试android NDK 交叉编译的cpp文件

主要讲一下具体的步骤,具体的ndk指令我就不说了,贴的文章都有:
首先是写一个.java文件,本例中是HprofDumper.java
具体如下:

public class HprofDumper {

public native boolean hprofDumper(String filename, String outname);
}

然后用命令javac HprofDumper.java 生成.class文件
再用javah HprofDumper 生成相应的.h文件

生成的.h文件如下
#include

#ifndef _Included_HprofDumper
#define _Included_HprofDumper
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jboolean JNICALL Java_HprofDumper_hprofDumper
(JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

然后只需要在对应的.cpp文件完成相应函数即可,核心代码如下:
#include "HprofDumper.h"
#include "hprof.h"

JNIEXPORT jboolean JNICALL Java_HprofDumper_hprofDumper
(JNIEnv *env, jobject obj, jstring in_file, jstring out_file)
{
const char *filename = env->GetStringUTFChars(in_file, 0);
const char *outname = env->GetStringUTFChars(out_file, 0);
return hprof_mp(filename, outname);
}
其中hprof_mp是纯c++代码,引入即可。
有一点需要注意,标红了已经,就是生成的.h文件函数并没具体形参名字,只有形参类型,在.cpp文件中要加入相应的形参名字,本例为env、 obj、 in_file和out_file。
还有一点c和c++的区别,就是env的使用。
本例中C++为env->GetStringUTFChars(in_file, 0);
如果是C就应该改为(env)->GetStringUTFChars(env,in_file, 0);
调用Java类型 : C中调用Java中的String类型为 jstring;

C语言方法名规则 : Java_完整包名类名_方法名(JNIEnv *env, jobject thiz), 注意完整的类名包名中包名的点要用 _ 代替;

参数介绍 : C语言方法中有两个重要的参数, JNIEnv *env, jobject thiz ;
-- JNIEnv参数 : 该参数代表Java环境, 通过这个环境可以调用Java中的方法;
-- jobject参数 : 该参数代表调用jni方法的类,;

调用jni.h中的NewStringUTF方法 : 该方法的作用是在C语言中创建一个Java语言中的String类型对象, jni.h中是这样定义的 jstring (*NewStringUTF)(JNIEnv*, const char*), JNIEnv 结构体中包含了 NewStringUTF 函数指针, 通过 JNIEnv 就可以调用这个方法;

完成代码编写后,在当前目录下完成Android.mk和Application.mk的编写
首先是Android.mk
本例中为:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hprof-mper
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_C_INCLUDES += bionic
LOCAL_C_INCLUDES += bionic/libstdc++/include
LOCAL_SRC_FILES := HprofDumper.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xxx.cpp
LOCAL_SHARED_LIBRARIES := libstlport
include $(BUILD_SHARED_LIBRARY)
注意标红的是最关键的,LOCAL_C_INCLUDES 顾名思义是需要的头文件的所在的目录,那三个参数主要为了引入STL,最重要!!LOCAL_SHARED_LIBRARIES 我一直生成失败就是没加这个参数,不光要引入头文件,还要引入具体的lib,这就是这个字段的作用。
具体字段的作用:
-- LOCAL_PATH : 代表mk文件所在的目录;
-- include $(CLEAR_VARS) : 编译工具函数, 通过该函数可以进行一些初始化操作;
-- LOCAL_MODULE : 编译后的 .so 后缀文件叫什么名字;
-- LOCAL_SRC_FILES: 指定编译的源文件名称;
-- include $(BUILD_SHARED_LIBRARY) : 告诉编译器需要生成动态库;

Applicaion.mk中就一行
APP_STL = stlport_static
表示使用stl静态库。

注意:我用了STL,大家没有用STL的当然不用引入这些啦~

I. 为啥Android下用到的.cpp中的sizeof(wchar_t)占用四个字节

晕,打个回车,结果发表了。我重新叙述下问题。我的android工程要用到C++代码。在cygwin下gdb调试时发现sizeof(wchar_t)的结果是4,我看网上说是可以通过-fshort-wchar 来解决,于是我在mk文件中加入了下面这句话 LOCAL_CPP_FLAGS := -fshort-wchar 但是调试时发现还是占用4个字节。而在 Cygwin下通过vi ,新建一个.cpp文件,里面cout << sizeof(wchar) << endl; 得出的结果却是2。 求解,先谢谢啦

热点内容
少儿编程排行 发布:2025-01-24 04:40:46 浏览:698
搭建服务器怎么使用 发布:2025-01-24 04:19:34 浏览:443
平行进口霸道哪些配置有用 发布:2025-01-24 04:19:32 浏览:873
ngram算法 发布:2025-01-24 04:03:16 浏览:658
迷宫游戏c语言 发布:2025-01-24 03:59:09 浏览:358
荣耀30pro存储类型 发布:2025-01-24 03:54:02 浏览:556
客户端文件上传 发布:2025-01-24 03:48:44 浏览:257
推特更改密码的用户名是什么 发布:2025-01-24 03:45:55 浏览:596
cc编译选项 发布:2025-01-24 03:45:18 浏览:511
银行密码怎么被锁 发布:2025-01-24 03:37:02 浏览:431