动态注册
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 {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 {CMAKE_SOURCE_DIR}/cpp/*.c)
-
集成现成的so动态库 .a静态库步骤:
- 导入头文件 include_directories("${CMAKE_SOURCE_DIR}/cpp/inc")
- 导入库文件 set(CMAKE_CXX_FLAGS "{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" }