kotlin + C++ 使用jni中遇到的一些坑和建议

kotlin + C++ 使用jni中遇到的一些坑和建议

  • kotlin部分
    • kotlinc
    • 函数签名
    • 传输类型
    • 协程启动方式之一
  • C++部分
    • JNIEnv
    • jmethodID
    • 错误捕获
  • 参考文档

本文为笔者在做https://github.com/Nambers/MiraiCP中遇到的坑

kotlin部分

kotlinc

使用kotlinc代替javac命令,需要自己在搜索引擎上下载

函数签名

javap -s 类包路径查询函数签名,如C:\Program Files\Java\jdk1.8.0_261\bin\javah.exe" org.example.mirai.plugin.CPP_lib 该命令好像不支持>jdk 10
另,也可以使用动态绑定函数,就不用每次用javah生成头文件了

传输类型

在jni中双向传输数据最好都使用jni类型,如果不使用好像编译器也不会报错,如传输long类型用强转转到jlong

协程启动方式之一

runblock{ launch{ 函数() } }
其中runblock是阻塞
launch是启动协程在默认地方

C++部分

JNIEnv

每次调用c++部分都会传入一个JNIEnv*指针,而该指针所指向的是局部的,相当于在该函数结束后该指针就会失效,而vs的编译器未指明该错误,但是实际运行的时候jvm会报错EXCEPTION_ACCESS_VIOLATION,所以env指针只能局部使用
当然也有其他方式,比如用JNI_onload(不知道有没有打错)这个函数获取JavaVM实例,然后用JavaVM.GetEnv()获取env指针

jmethodID

可以在全局初始化的时候就寻找每个常用的jmethodID避免重复寻找造成的浪费

错误捕获

可以用env->ExceptionCheck()来检测

参考文档

JNI 开发笔记
JNI开发中,你需要知道的一些建议

你可能感兴趣的:(C\C++,踩坑记录,c++,dll,java,jni)