(1)dlna.c(假定库函数int play(void))
#include <dlfcn.h> //调用库函数需要包含的头文件
//声明一下
int play(void);
//调用库函数
int
play(void)
{
typedef int (*play_Func)(void);
play_Func m_play = NULL;
void *m_libDlnaHandle = NULL;
m_libDlnaHandle = dlopen("hw/dlna.so", RTLD_NOW);
m_play = (int(*)(void))dlsym(m_libDlnaHandle, "play");
if(NULL == m_play)
{
LOGE("baojinyu-------------dlsym play failed because %s\n", dlerror());
return -1;
}
else
LOGD("baojinyu-------------dlsym play symbol is %p\n", m_play);
(*m_play)();
return 1;
}
(2)jni(cpp文件)
//调用dlna.c文件中的函数int play(void)
static int android_os_play(JNIEnv *env, jobject clazz)
{
sync();
return play();
}
//增加方法对应
static JNINativeMethod method_table[] = {
{ "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
{ "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
{ "setScreenState", "(Z)I", (void*)setScreenState },
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
{ "dlnaPlay", "()I", (void*)android_os_play },
};
其中:
dlnaPlay 是java文件中的函数的名字
android_play 是jni文件中的函数的名字,前面的修饰(void*)是固定的,不管函数的参数和返回值是什么,它都是固定的。
中间部分:"()I" 代表参数和返回值
(3)java文件
public class dlna
{
...
public static native int dlnaPlay();
...
}
经过以上3步,就可以在应用程序中调用dlna.dlnaPlay()了。