android studio 调试c/c++代码小记

使用的android studio3.0.1版本,sdk 27.

新建的测试程序,勾选了c++支持,默认有native_lib.cpp。

1.在cpp中添加了测试的native代码,提示No implementation found for错误,怎么看都跟之前的默认函数没啥区别啊,于是盯着简单cpp代码逐行扫描。。。。。5分钟后,我去,自动生成的代码extern c竟然没有跟{},所以默认函数享受了extern c,而我添加的测试代码被认为没有实现,这绝对是个坑啊。以上,添加{}问题解决。

2.executing external native build for cmake 错误,由于添加了其他的测试代码,准备进行一些模块功能测试,所以有了目录分层,所以相当于调整了CMakeLists.txt,然后就是各种错误,之前只关注了这个错误,并不太熟悉android studio的操作,然后就各种点点点,终于发现了在messages窗口,gradle sync中有CMake Error的提示,比如我的错误是提示cmakelists.txt中的哪一行出错的,在gradle console中有具体的错误,提示我好多cpp文件找不到,而这些文件正是我后添加在其他目录的文件,所以问题明显,源文件目录错误,编译器找不到。。。。。。以上,修改正确的目录层级,问题解决。

3.将已有c++代码导入,编译时提示各种标准库函数无法使用,比如std::to_string、make_unique等等,分两步,一个是因为没有使用c++标准库,需要参数arguments "-DANDROID_STL=c++_shared",一个是因为需要c++14支持,cppFlags "-std=c++14",这两问题个是查了资料:https://stackoverflow.com/questions/22774009/android-ndk-stdto-string-support

4.想要添加另一个依赖库代码,编译为android平台的so,报错:error: linker command failed with exit code 1 (use -v to see invocation),发现是生成的so与最终依赖库的位置写的名字不一致导致的。

5.因为之前的c++代码中有很多同事的中文注释,直接用到android studio中会提示encoding问题,这时候就需要在Settings--->Editor--->File Encodings中指定编码格式,点击右边的小加号,选择c++代码目录,出现在path中,后面的encoding中选择GBK,apply-->ok,会发现都能正确显示中文了。

6.需要release版本的库,选择窗口左下角的Build Variants,然后选择对应的Variant,当然,选择release之后会提示错误,需要配置签名,这个大家可以查查,有很多教程。

7.关于debug进入c/c++代码,找到了一个方法,edit configurations-->debugger-->symbol directories界面里,点击右边的小加号,将项目生成的中间.o文件目录添加进来,之后在c/c++代码加断点就可以进入调试了。

8.如果调试的手机或者平板没有全部的打印信息,让你无法调试自己的程序,可以网上查找对应型号的设备如何打开工程模式,因为工程模式可以打开log级别的设置,很多设备都将默认logcat级别设置的高一点,提高性能。

9.编译出来的so库比较大,查找资料,发现需要在cmakelists.txt中设置strip参数:

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")

参考了https://stackoverflow.com/questions/38675403/how-to-config-cmake-for-strip-file,瞬间变小了。

10.使用的so库接口api,在jni接口中调用竟然提示error: undefined reference to,明明已经连接进去了为什么会出现这个问题呢,然后将接口extern到jni接口中,编译,依然报这个错误,查看与其他接口差异,发现问题:没有使用extern c属性,所以编译时不认识去哪里找接口,添加之后解决问题。

11.有一些平台差异的东西,希望在一份源码中同时维护,在cmakelist.txt中添加宏,方式就是:

add_definitions(-DANDROID),代表ANDROID宏,-D代表是defined

12.不同库函数有重名冲突的,可以在Cmakelists.txt中使用:

SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS -Wl,--no-undefined,--version-script,${PROJECT_SOURCE_DIR}/xxx/export.map)

SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS -Wl,--no-undefined,--retain-symbols-file,${PROJECT_SOURCE_DIR}/xxx/export.sym)

参考:https://www.2cto.com/kf/201703/610953.html

13.build variant无法切换debug和release的问题,应该是缓存问题,我尝试删除了.idea目录重新打开android studio就可以切换了。

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中编写C/C++代码,你需要进行以下步骤: 1. 创建一个新的Android Studio项目。 2. 在你的项目中创建一个新的C/C++源文件。你可以使用菜单File->New->C/C++ Source File来创建源文件。 3. 在你的源文件中编写C/C++代码。 4. 在你的项目中创建一个新的JNI头文件。你可以使用菜单File->New->JNI/C++ Header File来创建头文件。 5. 在你的JNI头文件中声明你的C/C++函数和变量。例如,如果你的C/C++源文件中有一个函数叫做myFunction,你可以在你的JNI头文件中这样声明它: ```c++ JNIEXPORT void JNICALL Java_com_example_myapp_MyClass_myFunction(JNIEnv *env, jobject obj); ``` 请注意,这里的Java_com_example_myapp_MyClass_myFunction是根据你的Java类和函数名称来自动生成的。你需要根据你的实际项目进行修改。 6. 在你的Java代码中,使用JNI接口调用你的C/C++函数。例如,如果你的Java类是MyClass,你可以在它的某个方法中这样调用你的C/C++函数: ```java public void myMethod() { myFunction(); } ``` 7. 在你的项目中配置NDK环境。你需要下载NDK并在你的项目中配置NDK路径。你可以使用菜单File->Project Structure->SDK Location来配置NDK路径。 8. 在你的项目中配置CMake。你需要创建一个CMakeLists.txt文件来告诉Android Studio如何编译你的C/C++代码。你可以使用以下模板来创建CMakeLists.txt文件: ``` cmake_minimum_required(VERSION 3.10.2) project(myproject C CXX) add_library(mylib SHARED mysource.cpp) target_link_libraries(mylib log) ``` 请注意,这里的mysource.cpp和mylib是根据你的实际项目进行修改。 9. 运行你的项目并测试你的C/C++代码。 请注意,以上步骤只是一个基本的示例,你需要根据你的实际项目需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值