`
ouyangfeng521
  • 浏览: 248754 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JNI 动态注册

 
阅读更多

由于静态注册要用javah生成头谁的,所以一般采用动态注册

 

代码如下

 

#include <jni.h>

#ifndef HELL_JNI
#define HELL_JNI


static const char *className = "com/braver/jni/dy/HelloJni";
#ifdef __cplusplus

extern "C" {
	JNIEXPORT jstring JNICALL hello(JNIEnv *, jobject);
#endif

#ifdef __cplusplus
}/*extern "C" {*/
#endif

#endif

 

#include "Hello_JNI.h"


//绑定函数指针
static JNINativeMethod gMethods[] = {
	{"hello","()Ljava/lang/String;" , (void *)hello}
};

JNIEXPORT jstring JNICALL hello(JNIEnv *env, jobject object)
{
	return (*env).NewStringUTF("hello");
}

//当在java层调System.loadLibrary("DyJNI");时会调用
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
	JNIEnv *env;
	//得到env
	if(vm->GetEnv((void**)&env , JNI_VERSION_1_4) != JNI_OK)
	{
		return JNI_ERR;
	}
	jclass claz;
	claz = env->FindClass(className);//查找类
	env->RegisterNatives(claz,gMethods,sizeof(gMethods) /sizeof(gMethods[0])); //注册
	return JNI_VERSION_1_4;
}

 

/**
 * @(#) HelloJni.java Created on 2012-10-10
 *
 * Copyright (c) 2012 Aspire. All Rights Reserved
 */
package com.braver.jni.dy;

/**
 * The class <code>HelloJni</code>
 *
 * @author ouyangfeng
 * @version 1.0
 */
public class HelloJni {

    static{
        String path = System.getProperty("user.dir");
        System.setProperty("java.library.path", path);
        System.loadLibrary("DyJNI");
    }
    public native String hello();
    
}
 /**
 * @(#) MainTest.java Created on 2012-10-10
 *
 * Copyright (c) 2012 Aspire. All Rights Reserved
 */
package com.braver.jni.test;

import com.braver.jni.dy.HelloJni;

/**
 * The class <code>MainTest</code>
 *
 * @author ouyangfeng
 * @version 1.0
 */
public class MainTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        final String str = new HelloJni().hello();
        System.out.println(str);

    }

}
 
分享到:
评论

相关推荐

    JNI动态注册

    本文将深入探讨“JNI动态注册”这一主题,通过一个具体的例子——`RegisterNatives`的使用,来帮助你深化对JNI的理解。 首先,我们需要理解JNI的基本结构。JNI提供了一种方式,让Java代码能够调用本地(非Java)...

    jni动态注册

    动态注册JNI方法是相对于静态注册的一种方式,主要在程序运行时完成对JNI方法的注册,而不是在编译期间。 在Android中,JNI方法通常有两种注册方式:静态注册和动态注册。静态注册是通过在Java源码中使用`@Native`...

    JNI动态注册 方式

    总结起来,JNI动态注册是一种灵活的机制,允许开发者在运行时动态添加本地方法,适应各种复杂需求。虽然它增加了编程的复杂度,但在某些特定场景下,如插件化和热更新,它的优势就显现出来了。理解和掌握JNI动态注册...

    android stadio jni动态注册函数

    JNI静态函数注册,根据Java+packname+method来实现的,名称...当JAVA层通过System.loadLibrary加载完JNI动态库后,紧接着会查找该库中一个叫JNI_OnLoad 的函数。如果有,就调用它,而动态注册的工作就是在这里完成的。

    dynamic_register_jni.zip

    1、JNI动态注册实例。 2、运行环境是Android studio。 3、动态注册是在JNi层实现的,JAVA层不需要关心,因为在system.load时就会去调用JNI_OnLoad,有就注册,没有就不注册。动态注册的原理:JNI 允许我们提供一个...

    jnitest.zip

    本压缩包“jnitest.zip”提供了Android中JNI动态注册的例子,帮助开发者理解和实践这一技术。 在传统的JNI开发中,我们需要在Java类中声明native方法,并在对应的C/C++源文件中静态地定义这些方法。这种方法需要...

    JNI 函数动态注册 JNIDynamicLoad

    `CMakeNdk1`可能是一个使用CMake构建的示例项目,它演示了如何使用CMake来编译和链接JNI动态注册所需的代码。CMake是一个跨平台的构建系统,可以生成适用于不同编译器和操作系统的构建文件,对于NDK项目来说,它可以...

    JNI_OnLoad动态注册的例子

    综上所述,`JNI_OnLoad`动态注册的例子展示了如何在本地库加载时执行初始化代码,并通过`RegisterNatives`动态注册本地方法,实现Java和C/C++之间的交互。这对于需要灵活管理本地方法的Java应用,特别是在嵌入式系统...

    JNI动态注册和静态注册演示.zip

    本教程将通过一个示例来演示JNI中的动态注册和静态注册方法。 1. **JNI基础知识** - JNI头文件:在使用JNI之前,需要创建一个`.h`头文件,该文件包含了Java类的C/C++表示形式,由`javah`工具自动生成。 - 本地...

    动态注册JNI方法写hello jni

    本教程将通过一个简单的"Hello JNI"程序,介绍如何使用动态注册的方式实现JNI。 首先,我们需要理解JNI的基本概念。JNI是一种接口,让Java虚拟机(JVM)能够调用本地(非Java)代码,同时本地代码也可以调用Java...

    JNI技术之动态注册与JNI线程.pdf

    总结来说,这个PDF文件提供了一个深入理解JNI动态注册和线程使用的实例,通过Java代码展示了如何在Android应用中调用和管理本地方法。学习这部分内容有助于开发者更高效地利用JNI进行跨语言编程,特别是在优化性能和...

    JNI静态/动态注册,引用第三方so库demo

    三、JNI动态注册 1. 动态注册不需在Java类中声明本地方法,而是使用`JNIEnv`指针在运行时动态注册本地方法。 2. 示例: - Java类: ```java public class JNIDemo { static { try { Class&lt;?&gt; clazz = Class....

    JNI文档资料源码_2020_02_08

    【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104222271 I ....

    JNI开发——不同class类中的native本地方法的动态注册

    本篇将深入探讨如何在多个类中动态注册JNI的本地方法,并进行模块化的代码管理。 在传统的JNI开发中,我们通常在Java类中声明`native`方法,然后在对应的`.c`或`.cpp`文件中使用`JNIEXPORT`和`JNICALL`宏定义来实现...

    JNIAutoRge.zip

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI通常...学习这个项目将有助于理解JNI动态注册的工作原理,并能应用于实际的Android开发中。

    android 下JNI介绍和应用

    为了让 JVM 能够识别并调用这些 native 方法,需要通过 JNI 动态注册机制。注册通常在 `JNI_OnLoad()` 函数中完成。例如,`register_android_media_MediaPlayer` 函数就是用于注册 `MediaPlayer` 类中的所有 native ...

    android jni c 静态注册和动态注册

    本篇文章将深入探讨Android JNI的两种注册方式:静态注册和动态注册,并在Eclipse和Android Studio环境下进行操作。 ### 静态注册: 静态注册是JNI最常用的方式,它在编译时完成。在Java类中,我们声明native方法...

    DynamicJniDemo.zip

    本示例"DynamicJniDemo.zip"是专为初学者设计的,旨在教授如何在Android项目中使用NDK(Native Development Kit)进行JNI动态注册的方法。下面将详细介绍这个过程中的关键知识点。 1. **JNI基础**: JNI允许Java...

    Android Studio JNI 的静动态注册开发以及CC++ JNIEnv的理解

    本篇文章将深入探讨在Android Studio中如何进行JNI的静动态注册开发,以及对JNIEnv的理解。 首先,让我们理解静动态注册的概念。静态注册是早期JNI常用的方法,它需要在Java类中声明native方法,并在对应的C/C++...

Global site tag (gtag.js) - Google Analytics