由于静态注册要用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动态注册”这一主题,通过一个具体的例子——`RegisterNatives`的使用,来帮助你深化对JNI的理解。 首先,我们需要理解JNI的基本结构。JNI提供了一种方式,让Java代码能够调用本地(非Java)...
动态注册JNI方法是相对于静态注册的一种方式,主要在程序运行时完成对JNI方法的注册,而不是在编译期间。 在Android中,JNI方法通常有两种注册方式:静态注册和动态注册。静态注册是通过在Java源码中使用`@Native`...
总结起来,JNI动态注册是一种灵活的机制,允许开发者在运行时动态添加本地方法,适应各种复杂需求。虽然它增加了编程的复杂度,但在某些特定场景下,如插件化和热更新,它的优势就显现出来了。理解和掌握JNI动态注册...
JNI静态函数注册,根据Java+packname+method来实现的,名称...当JAVA层通过System.loadLibrary加载完JNI动态库后,紧接着会查找该库中一个叫JNI_OnLoad 的函数。如果有,就调用它,而动态注册的工作就是在这里完成的。
1、JNI动态注册实例。 2、运行环境是Android studio。 3、动态注册是在JNi层实现的,JAVA层不需要关心,因为在system.load时就会去调用JNI_OnLoad,有就注册,没有就不注册。动态注册的原理:JNI 允许我们提供一个...
本压缩包“jnitest.zip”提供了Android中JNI动态注册的例子,帮助开发者理解和实践这一技术。 在传统的JNI开发中,我们需要在Java类中声明native方法,并在对应的C/C++源文件中静态地定义这些方法。这种方法需要...
`CMakeNdk1`可能是一个使用CMake构建的示例项目,它演示了如何使用CMake来编译和链接JNI动态注册所需的代码。CMake是一个跨平台的构建系统,可以生成适用于不同编译器和操作系统的构建文件,对于NDK项目来说,它可以...
综上所述,`JNI_OnLoad`动态注册的例子展示了如何在本地库加载时执行初始化代码,并通过`RegisterNatives`动态注册本地方法,实现Java和C/C++之间的交互。这对于需要灵活管理本地方法的Java应用,特别是在嵌入式系统...
本教程将通过一个示例来演示JNI中的动态注册和静态注册方法。 1. **JNI基础知识** - JNI头文件:在使用JNI之前,需要创建一个`.h`头文件,该文件包含了Java类的C/C++表示形式,由`javah`工具自动生成。 - 本地...
本教程将通过一个简单的"Hello JNI"程序,介绍如何使用动态注册的方式实现JNI。 首先,我们需要理解JNI的基本概念。JNI是一种接口,让Java虚拟机(JVM)能够调用本地(非Java)代码,同时本地代码也可以调用Java...
总结来说,这个PDF文件提供了一个深入理解JNI动态注册和线程使用的实例,通过Java代码展示了如何在Android应用中调用和管理本地方法。学习这部分内容有助于开发者更高效地利用JNI进行跨语言编程,特别是在优化性能和...
三、JNI动态注册 1. 动态注册不需在Java类中声明本地方法,而是使用`JNIEnv`指针在运行时动态注册本地方法。 2. 示例: - Java类: ```java public class JNIDemo { static { try { Class<?> clazz = Class....
【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104222271 I ....
本篇将深入探讨如何在多个类中动态注册JNI的本地方法,并进行模块化的代码管理。 在传统的JNI开发中,我们通常在Java类中声明`native`方法,然后在对应的`.c`或`.cpp`文件中使用`JNIEXPORT`和`JNICALL`宏定义来实现...
JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI通常...学习这个项目将有助于理解JNI动态注册的工作原理,并能应用于实际的Android开发中。
为了让 JVM 能够识别并调用这些 native 方法,需要通过 JNI 动态注册机制。注册通常在 `JNI_OnLoad()` 函数中完成。例如,`register_android_media_MediaPlayer` 函数就是用于注册 `MediaPlayer` 类中的所有 native ...
本篇文章将深入探讨Android JNI的两种注册方式:静态注册和动态注册,并在Eclipse和Android Studio环境下进行操作。 ### 静态注册: 静态注册是JNI最常用的方式,它在编译时完成。在Java类中,我们声明native方法...
本示例"DynamicJniDemo.zip"是专为初学者设计的,旨在教授如何在Android项目中使用NDK(Native Development Kit)进行JNI动态注册的方法。下面将详细介绍这个过程中的关键知识点。 1. **JNI基础**: JNI允许Java...
本篇文章将深入探讨在Android Studio中如何进行JNI的静动态注册开发,以及对JNIEnv的理解。 首先,让我们理解静动态注册的概念。静态注册是早期JNI常用的方法,它需要在Java类中声明native方法,并在对应的C/C++...