Android jni 编译和使用总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16064871/article/details/82082458

最近遇到很多奇奇怪怪的问题,就在这里记录一下。

1、jni 数组初始化传入

最近遇到一个问题,就是传一个byte数组到c++里面,进行传出值
        byte[] mData = new byte[128];
        ParseRg.Decrypt(key, mData);  //这个是调用jni的
        
   byte[] mData = new byte[128];
   c++库初始化了128个字节。jni调用时候。所以这里需要初始化128
  如果是 byte[] mData = new byte[64];;
  在兼容部分机器时候。会出现内存异常产生崩溃。这个原因有时不好找到。以为在有些机器是很正常,有些机器就崩溃了。
  就是和机器分配内存有关系。

2、ndk版本编译问题

android-ndk-r8d 使用这个版本ndk编译时不能编译64位的so库。只能编译 32系统的so库。

只能编译如下。

android-ndk-r10b 使用这个版本ndk可以编译 64位系统的so库。具体so类型如下:

可以看出上面多了很多64位的so库。

3、关于编译宏定义的问题

Android.mk文件里面设置全局代码的宏定义:


 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := binder_demo_show
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := test.cpp

TARGET_BUILD_VARINT := userdebug #宏定义为userdebug

或者在Application.mk定义

写法一: DEBUG是宏     LOCAL_CFLAGS += -DDEBUG

写法二:

APP_CPPFLAGS := -frtti -DCOCOS2D_DEBUG=1 -DCC_ENABLE_CHIPMUNK_INTEGRATION=1

注意:-D (必须要有这个)COCOS2D_DEBUG=1 具体参考makefile。

APP_CPPFLAGS
A set of C++ compiler flags passed when building C++ sources only.
NOTE: In android-ndk-1.5_r1, this applied to both C and C++ sources. This has been corrected to match the full Android build system. You can now use APP_CFLAGS for flags that shall apply to C and C++ sources.(摘自ndk说明文档)

4、升级ndk r10后在安卓5.0以下版本运行报cannot locate symbol atof

推荐解决:

原因:Android的stdlib.h中atof是内联的
解决方法:将所有的atof改成strtod
示例代码:
char *strpi = "3.1415";
double dpi;
dpi = atof(strpi); 修改为: dpi = strtod(strpi, NULL);

参考自:http://stackoverflow.com/questions/14571399/Android-ndk-cant-find-atof-function

详细3种方案:https://www.cnblogs.com/momoshengxiao/p/6784681.html

猜你喜欢

转载自blog.csdn.net/qq_16064871/article/details/82082458