【Android】jni调用

动态注册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开发艺术探索》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值