动态注册jni
1、load so库文件
static {
Log.d(LOG_TAG, "EventManager Load library~");
try {
System.loadLibrary("JNI_EventManager");
} catch (UnsatisfiedLinkError e) {
Log.d(LOG_TAG, "Cannot load JNI_EventManager library:\n" + e.toString());
}
}
需要先编译生成so文件,在system\lib中有这个so库,里面使用的第三方库也是一样
2、定义接口
private native void SendEvent(Tv_EventInfo info, String listener_name);
private native void SendBroadcast(Tv_EventInfo info);
private native void RegisteEventListener(Tv_EventListener listener, String name, int event);
private native void UnregisteEventListener(String listener_name, int event);
private native void DisableSystemTimeEvent(int event);
private native void EnableSystemTimeEvent(Tv_EventInfo info,int time_sec);
private native void Connect();
private native void Disconnect();
3、生成文件JNI_XXX_EventManager.h
void JNI_xxx_EventManager_SendEvent(JNIEnv *env, jobject thiz, jobject info,jstring name);
void JNI_xxx_EventManager_SendBroadcast(JNIEnv *env, jobject thiz, jobject info);
void JNI_xxx_EventManager_RegisteEventListener(JNIEnv *env, jobject thiz, jobject listener,jstring name,jint event);
void JNI_xxx_EventManager_UnregisteEventListener(JNIEnv *env, jobject thiz,jstring name,jint event);
void JNI_xxx_EventManager_DisableSystemTimeEvent(JNIEnv *env, jobject thiz,jint event);
void JNI_xxx_EventManager_EnableSystemTimeEvent(JNIEnv *env, jobject thiz,jobject info,jint time_usec);
void JNI_xxx_EventManager_ConnectNativeService(JNIEnv *env, jobject thiz);
void JNI_xxx_EventManager_DisconnectNativeService(JNIEnv *env, jobject thiz);
动态注册jni
static JNINativeMethod method_table[] =
{
{"SendEvent","(Lxxx/EventManager/Tv_EventInfo;Ljava/lang/String;)V", (void *)JNI_xxx_EventManager_SendEvent},
{"SendBroadcast","(Lxxx/EventManager/Tv_EventInfo;)V", (void *)JNI_xxx_EventManager_SendBroadcast},
{"RegisteEventListener", "(Lxxx/EventManager/Tv_EventListener;Ljava/lang/String;I)V", (void *)JNI_xxx_EventManager_RegisteEventListener},
{"UnregisteEventListener", "(Ljava/lang/String;I)V", (void *)JNI_xxx_EventManager_UnregisteEventListener},
{"DisableSystemTimeEvent", "(I)V", (void *)JNI_xxx_EventManager_DisableSystemTimeEvent},
{"EnableSystemTimeEvent", "(Lxxx/EventManager/Tv_EventInfo;I)V", (void *)JNI_xxx_EventManager_EnableSystemTimeEvent},
{"Connect","()V",(void *)JNI_xxx_EventManager_ConnectNativeService},
{"Disconnect","()V",(void *)JNI_xxx_EventManager_DisconnectNativeService},
};
ONCEANUS_JNI_LOAD(xxx_EventManager,EventManager); //jni连接、注册上面定义的接口接口 跟Java的native保持一致
#define ONCEANUS_JNI_LOAD(NativeClient,JavaClass)
static int register_JNI_xxx_##NativeClient(JNIEnv *env) \
{ \
return android::AndroidRuntime::registerNativeMethods(env,_stringify(class_service_path(JavaClass)), method_table, NELEM(method_table)); \
} \
extern "C" jint JNI_OnLoad(JavaVM *vm, void *reserved) \
{ \
JNIEnv *env = NULL; \
if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK)\
{ \
return -1; \
} \
assert(env != NULL); \
if (register_JNI_OceanusTv_##NativeClient(env) < 0)\
{ \
return -1; \
} \
return JNI_VERSION_1_4;\
}
4、接口实现JNI_xxx_EventManager.cpp,如:
void JNI_OceanusTv_OClt_EventManager_SendBroadcast(JNIEnv *env, jobject thiz, jobject info)
{
jclass Java_Info_Class = env->GetObjectClass(info);
if(Java_Info_Class == NULL)
{
return;
}
env->DeleteLocalRef(Java_Info_Class);
}
静态注册
package com.example.handler.xml;
/**
* Created by linfangfang on 19/1/14.
*/
public class JniTest {
static {
System.loadLibrary("jni-test");
}
public void setV(String string){
setValue(string);
}
public String getV(){
String string=getValue();
return string;
}
native void setValue(String string);
native String getValue();
}
到工程的java目录下执行:
javac com/example/handler/xml/JniTest.java
javah com.example.handler.xml.JniTest
生成com_example_handler_xml_JniTest.h头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_handler_xml_JniTest */
#ifndef _Included_com_example_handler_xml_JniTest
#define _Included_com_example_handler_xml_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_handler_xml_JniTest
* Method: setValue
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_example_handler_xml_JniTest_setValue
(JNIEnv *, jobject, jstring);
/*
* Class: com_example_handler_xml_JniTest
* Method: getValue
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_handler_xml_JniTest_getValue
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
//
// Created by 林芳芳 on 19/1/14.
//
#include "com_example_handler_xml_JniTest.h"
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_handler_xml_JniTest
* Method: setValue
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_example_handler_xml_JniTest_setValue
(JNIEnv *env, jobject thiz, jstring string)
{
printf("invoke value=====\n");
char *c=(char*)env->GetStringUTFChars(string,NULL);
printf("invoke value *c=====\n",*c);
env->ReleaseStringUTFChars(string,c);
}
/*
* Class: com_example_handler_xml_JniTest
* Method: getValue
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_handler_xml_JniTest_getValue
(JNIEnv *env, jobject thisz)
{
printf("get value=====\n");
return env->NewStringUTF("hello test!!!");
}
#ifdef __cplusplus
}
#endif
参考:
《Android开发艺术探索》