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

jni的使用实例

    博客分类:
  • util
阅读更多

自己参考网上资料写的一些有代表性的实例,仅供参考。

 

没啥说的,测试类

package hellonative;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

/**
 *
 * @author lan
 */
public class Main {

    static {
        try {
            InputStream inputStream = Main.class.getResourceAsStream("HelloNative.dll");
//            System.out.println(inputStream);
            File temporaryDll = File.createTempFile("HelloNative", ".dll");
//            System.out.println(temporaryDll.getAbsolutePath());
            FileOutputStream outputStream = new FileOutputStream(temporaryDll);
            byte[] array = new byte[8192];
            int i = -1;
            while ((i = inputStream.read(array)) != -1) {
                outputStream.write(array, 0, i);
            }
            outputStream.close();
            temporaryDll.deleteOnExit();
            System.out.println(temporaryDll.getAbsolutePath());
            System.load(temporaryDll.getPath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Main m = new Main();
        m.nativePrint();

        m.sayHello("世界");

        System.out.println(m.sayFromC());

        System.out.println(m.addition(10, -5));

        System.out.println(m.isEqual(10, 1));

        String[] array = new String[6];
        for (String s : m.changeStringArray(array)) {
            System.out.print(s + "  ");
        }
        System.out.println();

        int[] is = new int[14];
        for (int i : m.changeIntArray(is)) {
            System.out.print(i + "  ");
        }
        System.out.println();

        Commons c = new Commons(111, "who?");
        m.readObject(c);
        System.out.println(c);

        c = m.writeObject();
        System.out.println(c);
    }

    private native void nativePrint();

    private native void sayHello(String hello);

    private native String sayFromC();

    private native int addition(int a, int b);

    private native boolean isEqual(float a, float b);

    private native int[] changeIntArray(int[] array);

    private native String[] changeStringArray(String[] array);

    private native void readObject(Commons com);

    private native Commons writeObject();
}

 头文件就不用说了

实现的c文件,字段签名可以用javap -s 类全名(包和类名)查看,感觉和反射差不多

#include <jni.h>
#include <stdio.h>
#include "Hello.h"

JNIEXPORT void JNICALL Java_hellonative_Main_nativePrint
(JNIEnv * env, jobject obj) {
    printf("Hello from c.\n");
}

JNIEXPORT void JNICALL Java_hellonative_Main_sayHello
(JNIEnv * env, jobject obj, jstring hello) {
    char* str;
    str = (char*) (*env)->GetStringUTFChars(env, hello, NULL);
    printf("Hello %s from c.\n", str);
    (*env)->ReleaseStringUTFChars(env, hello, str);
}

JNIEXPORT jstring JNICALL Java_hellonative_Main_sayFromC
(JNIEnv * env, jobject obj) {
    char* str = "c say hello 世界";
    return (*env)->NewStringUTF(env, str);
}

JNIEXPORT jint JNICALL Java_hellonative_Main_addition
(JNIEnv * env, jobject obj, jint a, jint b) {
    int i = a;
    int j = b;
    return (jint) i + j;
}

JNIEXPORT jboolean JNICALL Java_hellonative_Main_isEqual
(JNIEnv * env, jobject obj, jfloat a, jfloat b) {
    float i = a;
    float j = b;
    float k = i - j;
    if (k == 0) {
        return (jboolean) 1;
    }
    return (jboolean) 0;
}

JNIEXPORT jintArray JNICALL Java_hellonative_Main_changeIntArray
(JNIEnv * env, jobject obj, jintArray jia) {
    int length = (*env)->GetArrayLength(env, jia);
    int i = 0;
    int k[length];
    jintArray array = (*env)->NewIntArray(env, length);
    for (i = 0; i < length; i++) {
        k[i] = i * 10;
    }
    (*env)->SetIntArrayRegion(env, array, 0, length, k);
    return array;
}

JNIEXPORT jobjectArray JNICALL Java_hellonative_Main_changeStringArray
(JNIEnv * env, jobject obj, jobjectArray joa) {
    int length = (*env)->GetArrayLength(env, joa);
    int i = 0;
    jclass oc = (*env)->FindClass(env, "java/lang/String");
    jobjectArray array = (*env)->NewObjectArray(env, length, oc, 0);
    for (i = 0; i < length; i++) {
        char* str = "Hello";
        jstring s = (*env)->NewStringUTF(env, str);
        (*env)->SetObjectArrayElement(env, array, i, s);
    }
    return array;
}

JNIEXPORT void JNICALL Java_hellonative_Main_readObject
(JNIEnv * env, jobject obj, jobject commons) {
    jclass class = (*env)->GetObjectClass(env, commons); //or FindClass();

    jfieldID fid = (*env)->GetFieldID(env, class, "id", "I");
    jmethodID mid = (*env)->GetMethodID(env, class, "setName", "(Ljava/lang/String;)V");
    int value = (*env)->GetIntField(env, commons, fid);
    printf("id is %d\n", value);
    (*env)->SetIntField(env, commons, fid, 10);
    jstring s = (*env)->NewStringUTF(env, "Hello");
    (*env)->CallVoidMethod(env, commons, mid, s);
    (*env)->ReleaseStringUTFChars(env, s, (*env)->GetStringUTFChars(env, s, 0));
}

JNIEXPORT jobject JNICALL Java_hellonative_Main_writeObject
(JNIEnv * env, jobject obj) {
    jclass class = (*env)->FindClass(env, "hellonative/Commons");
    jmethodID mid = (*env)->GetMethodID(env, class, "<init>", "(ILjava/lang/String;)V");
    const char* str = "这是what?";
    jstring s = (*env)->NewStringUTF(env, str);
    jobject o = (*env)->NewObject(env, class, mid, 100, s);
    (*env)->ReleaseStringUTFChars(env, s, str);
    return o;
}

 

这个就是Commons文件了

package hellonative;

/**
 *
 * @author lan
 */
public class Commons {

    private int id;
    private String name;

    public Commons(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Commons[id:" + id + ",name:" + name + "]";
    }
}

 最后是运行结果了

G:\Users\lan\AppData\Local\Temp\HelloNative461556334708685656.dll
c say hello 世界
5
false
Hello  Hello  Hello  Hello  Hello  Hello  
0  10  20  30  40  50  60  70  80  90  100  110  120  130  
Commons[id:10,name:Hello]
Commons[id:100,name:这是what?]
Hello from c.
Hello 世界 from c.
id is 111
分享到:
评论

相关推荐

    CarDVR jni使用实例

    在这个"CarDVR jni使用实例"中,我们可以深入探讨JNI的基本概念、工作原理以及如何在实际项目中应用。 首先,我们需要了解JNI的核心概念。JNI是Java平台提供的一种接口,它定义了一套标准的C/C++函数调用规范,使得...

    JNI使用实例

    这个“JNI使用实例”可能是一个详细的教程,涵盖了如何在Android应用程序中设置和使用JNI的基本步骤。首先,我们需要创建一个Java类,声明native方法,这些方法将在本地代码中实现。例如: ```java public class ...

    Android NDK JNI 经典实例

    Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例

    ubuntu上面使用jni例子

    这个"ubuntu上面使用jni例子"的压缩包很可能是提供了一个在Ubuntu环境下开发和运行JNI程序的示例。 JNI的核心在于创建本地方法接口,这些接口允许Java代码调用C/C++编写的函数,反之亦然。下面我们将深入探讨在...

    安卓使用jni的例子

    这个“安卓使用jni的例子”是一个实际应用JNI的示例,用于展示如何在Android平台上通过JNI接口实现Java代码调用C/C++代码。 首先,我们需要了解JNI的基本结构。在Java端,我们会定义一个native方法,这个方法没有...

    JNI 调用实例(java JNI cpp互相调用实例)

    通过本文,我们可以了解 Java 和 C++ 之间的互相调用实例的实现过程,包括 C++ DLL 文件的创建和使用,以及 Java 代码中使用 JNI 技术调用 C++ DLL 文件的实现细节。这种技术可以应用于需要 Java 和 C++ 之间互相...

    jni最简单例子,注释详细

    JNI,全称Java Native Interface...这个“jni最简单例子”可能涵盖了以上的一些基础知识,详细注释可以帮助初学者理解JNI的工作原理和使用方法。在实际开发中,理解和熟练运用JNI是提高程序效率和扩展功能的重要手段。

    java jni简单实例

    2. **头文件生成**:在使用JNI前,我们需要为每个本地方法生成对应的C/C++头文件,这通常通过`javah`工具完成。这个头文件包含了Java类和方法的定义,以及JNI所需的函数原型。 3. **本地方法实现**:在生成的头文件...

    android调用jni实例

    我们将以"android调用JNI实例"为例,一步步解释这个过程。 首先,我们需要准备开发环境。安装Android NDK是必不可少的步骤,NDK(Native Development Kit)是一组工具,开发者可以使用它来编写用C和C++编写的本地...

    AIDL和JNI使用的小例子

    总结一下,本示例提供的`testndk`项目是一个结合使用AIDL和JNI的实践案例,展示了如何在Android应用中进行跨进程通信并利用C/C++代码提升性能。通过阅读源码和配合博客文章,你可以深入理解这两种技术的工作原理和...

    Android jni 编程实例

    在这个"Android jni 编程实例"中,我们将探讨如何在Android Studio环境下进行JNI开发,通过一个简单的入门demo来学习这个过程。 首先,我们需要了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码...

    Jni完整实例

    本实例“Jni完整实例”提供了一个完整的流程,教你如何在Eclipse环境下使用NDK进行JNI开发,并且项目可以直接运行,这对于理解JNI和NDK的工作机制非常有帮助。 首先,要理解JNI的核心概念。JNI是一种接口,它定义了...

    Java再说JNI之实例

    本文将深入介绍JNI的使用和实例,帮助开发者更好地理解和应用这一技术。 首先,我们需要理解JNI的基本概念。JNI是Java平台标准版(Java SE)的一部分,提供了一套接口,使得Java代码能够无缝地与本地代码进行通信。...

    jni学习例子 在linux下执行成功

    这个例子展示了如何通过Java调用本地(C/C++)代码,并且提供了完整的流程,包括从Java类型转换为C类型,特别是将`jstring`转化为`char`数组。 1. **JNI基本概念**:JNI是一种接口,使得Java代码能够调用本地方法...

    jni教程实例手把手

    在这个“jni教程实例手把手”资源中,包含了多个文档和一个示例项目,旨在帮助学习者全面理解并掌握JNI的使用。 1. **Android_JNI总结.doc**:这份文档可能是对Android平台上JNI应用的总结,涵盖了JNI的基本概念、...

    jni例子——使用int数组

    在这个“jni例子——使用int数组”的示例中,我们将深入探讨如何在Java和C/C++之间传递和操作int数组。 1. **JNI基础知识**: - JNI接口提供了Java与本地代码(如C/C++)通信的桥梁,使得开发者可以在Java应用中...

    eclipse使用jni的简单实例

    在本实例中,我们将探讨如何使用Eclipse集成开发环境来创建一个简单的JNI项目,实现C语言与Java之间的字符串传递。 首先,我们需要了解JNI的基本概念。JNI提供了一种方式,使得Java应用程序能够调用本地(非Java)...

    Windows下JNI初学实例

    【Windows下JNI初学实例】 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常重要,例如调用系统底层库、提升性能、接入硬件设备等。这篇...

Global site tag (gtag.js) - Google Analytics