`
binfox7777
  • 浏览: 21587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java JNI浅析(一)

jni 
阅读更多
JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
    使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。
    JNI(Java Native Interface)的书写步骤

    * 编写带有native声明的方法的java类

    * 使用javac命令编译所编写的java类

    * 使用javah  jni java类名生成扩展名为h的头文件    

    * 使用C/C++实现本地方法    

    * 将C/C++编写的文件生成动态连接库

编写java程序 这里以One world为例
public class StringDLL{
    static
    {
    System.loadLibrary("testStringJNI");
    }
    public native static String get();
    public native static void set(String name);
    public static void main(String[] args){
        StringDLL s = new StringDLL();
        s.set("Hello world");
        System.out.println(s.get());
    }
}
如果是静态类型方法则生成的头文件中方法的第二个参数是对java类的引用(JNIEnv *, jclass),如不是静态类型则是对对象的引用(JNIEnv *, jobject)
使用javah 生成扩展名为h的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class StringDLL */

#ifndef _Included_StringDLL
#define _Included_StringDLL
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     StringDLL
* Method:    get
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_StringDLL_get
  (JNIEnv *, jclass);

/*
* Class:     StringDLL
* Method:    set
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_StringDLL_set
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif
使用C实现本地方法
#include "stdafx.h"
#include "testStringJNI.h"
#include <stdlib.h>
const char * chs;
jstring s;
JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls)
{      
    /* 简单返回转换const char为jstring */
    return (*env)->NewStringUTF(env,chs);
}
JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s)
{
    chs = (*env)->GetStringUTFChars(env,s,0); //java与C类型不同,需用JNI方法进行转换
}
注意,我们总是用接口指针 env 来操作 Java 对象。
使用C++实现本地方法
#include "stdafx.h"

#include "testStringJNI.h"
#include <stdlib.h>
const char * chs;
jstring s;
JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls)
{      
    /* 简单返回转换const char为jstring */
    return env->NewStringUTF(chs);
}
JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s)
{
    chs = env->GetStringUTFChars(s,0); //java与C类型不同,需用JNI方法进行转换
}
使用 C++ 后,源代码变得更为直接,且接口指针参数消失。但是,C++ 的内在
机制与 C 的完全一样。在 C++ 中,JNI 函数被定义为内联成员函数,它们将扩
展为相应的 C 对应函数。
生成DLL文件
在.NET下新建Win32 Project工程名字为“testStringJNI”
在Application Setting里Aplication type点选DLL
拷贝头文件到工程中
书写C++程序实现头文件中定义的方法(见上页)
按F7或Build -> Build  Solution
我们生成DLL文件就放在工程目录下Debug文件夹里。名字就是 工程名.DLL
拷贝DLL到java文件目录下,运行java就可以看到控制台打印出“One world”
一个简单java通过JNI调用C、C++就完成了
分享到:
评论

相关推荐

    Android JNI 浅析

    Android JNI,全称为Java Native Interface,是Java平台的一个核心特性,它提供了一种方式让Java应用程序能够与本地C/C++代码进行交互。JNI使得开发者可以充分利用Java和C/C++的优点,例如Java的跨平台性和C/C++的...

    浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power电源控制

    在 Android 中,JNI 是一个关键的组件,它允许 Java 代码调用 native 代码。通过 JNI,可以使用 Java 语言来调用 Android 的 native 代码,从而实现对 WiFi 网络连接、dhcpcd 执行和 Power 电源控制的监控。 在上述...

    浅析android下如何通过jni监控wifi网络连接、dhcpcd执行和power

    JNI作为一种桥梁,使得Java代码能够调用这些原生代码,从而实现更高效、更底层的操作。这对于网络连接监控、系统资源管理等需要高性能或直接硬件访问的任务尤其重要。 ### 监控WiFi网络连接 在提供的代码片段中,`...

    JNI资源汇总

    - "Android_JNI浅析":可能从更直观的角度介绍了JNI,适合初学者快速理解JNI的工作原理。 - "jni详解":这可能是对JNI的深入解析,包括复杂的API使用和最佳实践。 了解和掌握JNI,开发者可以更好地利用Android...

    浅析JAVA之垃圾回收机制.doc

    该方法通常用于在对象被销毁前执行一些清理操作,例如释放JNI(Java Native Interface)所分配的本地资源。然而,依赖`finalize()`来释放资源不是最佳实践,因为它的调用时机不确定且可能导致性能问题。建议避免过度...

    浅析Android NDK编程中参数的传递.pdf

    例如,Java中的一个方法声明如下: ```java public static native int AddInt(int x); ``` 对应的C/C++函数声明应为: ```cpp JNIEXPORT jstring JNICALL Java_pkg_Test_demo_AddInt(JNIEnv* env, jclass cls, j...

    浅析Java中Runnable和Thread的区别

    这是因为`start()`方法内部会调用`start0()`,这是一个本地方法(`native`),它利用了JNI(Java Native Interface)技术来与操作系统进行交互,创建并启动一个真实的系统线程。 使用`Runnable`接口的好处是它可以...

    浅析Java内存模型与垃圾回收

    如果线程执行的是Java方法,计数器记录字节码的下一条指令;如果是Native方法,计数器值为空。 2. **Java虚拟机栈**:同样为线程私有,用于存储栈帧,每个栈帧包含局部变量表、操作数栈、动态链接和方法出口等信息...

    浅析JVM垃圾回收的过程

    - 本地方法栈JNI中栈帧引用的对象:JNI(Java Native Interface)允许Java代码调用本地(非Java)代码,本地方法栈中的引用也需要考虑。 这一过程通常会导致Stop-The-World(STW)事件,即所有线程暂停,直到...

    浅析Android.mk

    Android.mk是Android Native Development Kit (NDK) 中的关键文件,用于构建C/C++原生代码,通常是用于实现Java平台上的本地方法(JNI)。通过编写Android.mk,开发者能够控制如何编译、链接和打包本地库,使其能与...

    android笔记.rar

    3.1.1 从c++到java(一) ... ..46 3.1.2 从c++到java(二) ... ..47 3.2 常用技术... ..49 3.2.1 如何新建和使用控件... ..49 3.2.2 使用定时器Timer及消息处理 ... ...51 3.2.3 操作调试数据库与ContentProvider...

    Android博客来源:博客演示存储

    我的博客实例库( ##示例索引###博客:NDK-JNI实战教程(三)从比Hello World稍复杂点儿的NDK例子说说模板---------###博客:facebook Fresco框架库源使用基础---------###博客:浅谈MVP实现Android应用层开发------...

Global site tag (gtag.js) - Google Analytics