android NDK记录

235 阅读1分钟

动态注册

JNI_OnLoad(JavaVM * javaVm,void * ){ }

跨进程使用JNIEnv

JNIEnv * jniEnv = nullptr; jint result = ::javaVm->AttachCurrentThread(&jniEnv,nullptr); if(result == JNI_OK) { // 附加成功 } ::javaVm->DetachCurrentThread();

jobject 对象提升为全局引用

env->NewGlobalRef(jobj);

总结:

JNIEnv 绑定线程,同一个线程的native函数用的是同一个env

Cmake配置

  • 批量导入项目中的c/cpp .h文件 file(GLOB allSource *.c *.cpp *.h) add_library( native-lib SHARED ${allSource} )

  • 导入动态库so getndk是so库的名字, so库是放在jnilibs目录下的,还要区分cpu架构 v7 或者x86等等 add_library(getndk SHARED IMPORTED) set_target_properties(getndk PROPERTIES IMPORTED_LOCALTION CMAKESOURCEDIR/../jniLibs/{CMAKE_SOURCE_DIR}/../jniLibs/{CMAKE_ANDROID_ARCH_ABI}/libgetndk.so )

target_link_libraries( native-lib ${log-lib} getndk #链接此库到总库 native-lib.so )


查看手机的cpu架构 adb shell cat /proc/cpuinfo


命令行使用

  • ctrl + a 光标定位到头部

  • ctrl + e 光标定位到尾部

  • ctrl + u 将命令删除

  • ls -lh 列出文件的详细信息并且显示文件大小

  • ls -R 可以查看子目录文件

  • mv f.txt fff.txt 将f.txt重命名为fff.txt

  • lsb_release -a 查看系统信息

  • find . -name "*.cpp" 查看当前目录下的所有cpp文件


操作native层的bitmap

  • 导入头文件 #include <android/bitmap.h>
AndroidBitmapInfo bitmapInfo;
AndroidBitmap_getInfo(env,bitmap,&bitmapInfo)


void* pixels;
AndroidBitmap_lockPixels(env, bitmap, &pixels);
for(int i = 0;i < bitmapInfo.width * bitmapInfo.height; i++) {

}

AndroidBitmap_unlockPixels(env, bitmap);

cmake文件中加入 jnigraphics库 target_link_libraries( native-lib jnigraphics ${log-lib} )

cmake中写的jnigraphics 、 log等系统自带的库,那系统一共自带了哪些库呢? 可以去sdk\ndk\21\build\cmake\system_libs.cmake文件查看


如果CMakeLists.txt不在cpp目录下

  • 导入cpp c文件 使用: file(GLOB SOURCE CMAKESOURCEDIR/cpp/.cpp{CMAKE_SOURCE_DIR}/cpp/*.cpp {CMAKE_SOURCE_DIR}/cpp/*.c)

  • 集成现成的so动态库 .a静态库步骤:

    • 导入头文件 include_directories("${CMAKE_SOURCE_DIR}/cpp/inc")
    • 导入库文件 set(CMAKE_CXX_FLAGS "CMAKECXXFLAGSL{CMAKE_CXX_FLAGS} -L{CMAKE_SOURCE_DIR}/jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
    • 链接到总库 target_link_libraries( native-lib log fmod fmodL )

    源码的方式导入第三方库

    • add_subdirectory("${CMAKE_SOURCE_DIR}/cpp/xxx") xxx对应的是c库源码目录
    • 链接到总库 target_link_libraries( native-lib log rtmp #源码的cmake暴露出来的库名称 )

cpp文件中如果使用c的文件 需要在导入头文件的地方加如下extern

  • extern "C" {

    #import "libget/headfile.h" }