我需要从 ffmpeg libavcodec.so 调用
av_jni_set_java_vm
函数https://ffmpeg.org/doxygen/trunk/jni_8h.html.
如 ffmpeg 文档中所述,它采用
void *vm
作为参数。
我在 android (Python Kivy) 上使用 SDL2,并且我有
SDL_AndroidGetJNIEnv
函数 https://wiki.libsdl.org/SDL2/SDL_AndroidGetJNIEnv。
当我调用
SDL_AndroidGetJNIEnv
时,我得到525818896256(例如)JNI的地址。
我的理解是我应该用这个地址打电话给
av_jni_set_java_vm
,但我不明白该怎么做。
我是这样做的:
av = ctypes.CDLL('libavcodec.so')
jni = SDL_AndroidGetJNIEnv()
av.av_jni_set_java_vm(ctypes.cast(jni, ctypes.c_void_p).value, None)
设置参数类型和返回类型。返回值默认为
int
,在 64 位系统上对于 void*
来说太短了:
av = ctypes.CDLL('libavcodec.so')
av.SDL_AndroidGetJNIEnv.argtypes = ()
av.SDL_AndroidGetJNIEnv.restype = ctypes.c_void_p
jni = SDL_AndroidGetJNIEnv()
对其他函数执行相同的操作。那么你就不必投射任何东西了。