精华内容
下载资源
问答
  • java jni

    2008-05-20 20:16:57
    一个关于jni简单例子
  • module-jni:Qore Java JNI模块
  • Java JNI 编程

    2011-10-09 18:53:29
    Java JNI 编程 该文档讲诉了如何使用JNI来进行编程
  • 主要介绍了JAVA JNI函数的注册过程详细介绍的相关资料,需要的朋友可以参考下
  • java jni 简单教程

    2011-02-14 09:56:50
    java jni 简单教程
  • java jni c++代码

    2013-11-18 21:23:16
    java jni实现时的vs2010的c++代码
  • Java jni调用c实例

    2013-03-15 22:36:01
    Java jni调用c实例
  • 主要介绍了JAVA JNI原理的相关资料,这里提供简单实例代码,需要的朋友可以参考下
  • jni-library-sample:单个Gradle构建中的Java JNI和C ++
  • Java JNI介绍

    万次阅读 2013-06-09 10:20:21
    Java jni本意是Java native interface(Java本地接口),是为了方便Java调用c、c++等本地代码所封 装的一层接口。大家都知道,Java的优点是跨平台,但是作为优点的同时,其在本地交互的时候就编程了缺点。 Java的...

    Java jni本意是Java native interface(Java本地接口),是为了方便Java调用c、c++等本地代码所封

    装的一层接口。大家都知道,Java的优点是跨平台,但是作为优点的同时,其在本地交互的时候就编程了缺点。

    Java的跨平台特性导致其本地交互的能力不够强大,一些和操作系统相关的特性Java无法完成,于是Java提供了

    jni专门用于和本地代码交互,这样就增强了Java语言的本地交互能力。

    通过Java jni,用户可以调用用c、c++所编写的native code。在html5视频的开发中就采用了jni,

    android只用于ui的显示,其业务逻辑都是通过native code所完成的,android代码只是负责通过jni和native进

    行交互。

    通过Java jni来调用native code,需要如下几个步骤:

    1.声明native接口函数,语法如下:public native static void set(int i);

    其中native是Java的关键字,被native修饰的函数都是本地函数的接口,其具体功能要被native code来

    实现。
    //testdll.java
    public class testdll
    {
    static
    {
    System.loadLibrary("my");
    }
    public native static int get();
    public native static void set(int i);
    public static void main(String[] args)
    {
    testdll test = new testdll();
    test.set(3721);
    System.out.println(test.get());
    }
    }

    2.用javah命令导出Java jni中定义的本地方法的声明,这个是.h格式的头文件
    首先用javac编译出class文件,然后在用javah导出头文件,我们发现导出的头文件,其函数声明发生了

    变化,其中jint是jni定义的用来和c/c++交互的数据类型,可以当作int来用。

    //testdll.h
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class testdll */

    #ifndef _Included_testdll
    #define _Included_testdll
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     testdll
     * Method:    get
     * Signature: ()I
     */
    JNIEXPORT jint JNICALL Java_testdll_get
      (JNIEnv *, jclass);

    /*
     * Class:     testdll
     * Method:    set
     * Signature: (I)V
     */
    JNIEXPORT void JNICALL Java_testdll_set
      (JNIEnv *, jclass, jint);

    #ifdef __cplusplus
    }
    #endif
    #endif
    3. 实现Java jni中定义的native methods
    有了头文件以后,就可以用本地函数去实现头文件中声明的native函数了,通常用c和c++来实现native

    函数。
    //my.c
    #include "jni.h"
    #include "testdll.h"
    #include<stdio.h>

    static int i;

    JNIEXPORT jint JNICALL Java_testdll_get(JNIEnv *a, jclass b)
    {
    return i;
    }

    JNIEXPORT void JNICALL Java_testdll_set(JNIEnv *a, jclass b, jint j)
    {
    FILE *f;
    f=fopen("my.txt","a+");
    fwrite("嘿嘿你好啊xixi",1,14,f);
    fclose(f);
    i = j;
    }

    4.将native code编译成shared library供Java调用,针对Linux来说 就是.so文件,针对Windows来说就是.dll文

    件,Linux下用g++、gcc进行编译,这里不对其进行介绍,毕竟不难。对Windows来说,编译生成dll一般是通过vc

    来完成的。Windows下的动态链接库分为win32 dll和mfc dll,其中win32 dll可以供各种语言调用,而mfc dll则

    会受到一些限制。这里介绍win32 dll。
    生成一个win32 dll,要定义被导出的函数,有两种方式,函数名称前加_declspec(dllexport)或者定义def

    文件,然后用vc进行编译,这样做并不算复杂,但是我发现了一种更容易的方法,我们只需要按照c/c++的语法规

    范实现native函数,不需要定义被导出的函数,然后调用vc的编译工具cl.exe就可以了。
    首先将testdll.h和my.c拷贝到Microsoft Visual Studio x.x\VC\bin中,同时将jdk中include目录中的所有文件

    也都拷贝到Microsoft Visual Studio x.x\VC\bin中(这样做不是必须的,但是如果不这样,你调用cl命令的时

    候就要带上一大串路径信息),接着调出vs再带的命令行工具,进入bin目录,然后执行cl -I . -LD my.c -

    Femy.dll(.表示当前目录,I表示将在当前目录搜索包含的头文件,-LD后面表示源文件,-Fe后面紧跟的是目标文

    件),ok,my.dll生成了,将my.dll拷贝到Java文件所在的目录,执行Java命令,成功执行。

    上面只是个简单的示例,实际开发中还会有一些需要注意的问题,比如各种类型参数的传递,native code调用

    dll或so的情况,这里就不做介绍了,完毕。

    展开全文
  • JniTest.rar Android Java JNI 调用C++ Eclipse
  • Java JNI 技术文档教程

    2012-09-08 16:19:50
    Java JNI 技术文档教程,英文版,自己将网页版转为PDF
  • java jni c++ 类型转换

    2011-11-04 15:36:24
    java jni 与 c++ 数据类型转换 及调用
  • Java JNI 详细教程

    2010-04-23 20:02:25
    这是适合新手的详尽教程,让你在最短的时间内运行成功simple Java jni Demo!
  • JAVAjni,使用JAVA操作INI增删改查文件,UTF-8版,解决中文乱码问题
  • JavaJNI完全手册2

    2008-05-20 17:23:29
    JavaJNI完全手册
  • java jni 传递汉字参数,包括java传入dll 从dll传出到java 读写ini 包括全部 java 代码 工程文件 全部vc++6.0 Dll 代码 工程文件 找了好久资料才完成的,传上来省的大家再走弯路。
  • Java jni的使用 笔记

    千次阅读 2021-03-09 18:10:57
    Java jni的基本使用 建立java项目 使用ide新建项目 找到对应的class文件,生成.h文件 打开命令行窗口,进入上图地址,在此地址输入下图命令。 红色框中是class文件的地址 使用Visual Studio生成dll文件 点击 文件...

    sda

    Java jni的基本使用

    建立java项目

    使用ide新建项目
    在这里插入图片描述

    找到对应的class文件,生成.h文件

    在这里插入图片描述
    打开命令行窗口,进入上图地址,在此地址输入下图命令。
    红色框里是在这里插入图片描述
    红色框中是class文件的地址

    使用Visual Studio生成dll文件

    点击 文件——新建——项目 搜索c++选择动态链接库

    在这里插入图片描述
    需要下载如下工作负载否则搜不到动态链接库
    在这里插入图片描述
    将之前.class文件生成的.h文件以及jdk中jni.h以及jni_md.h放入工程目录下

    在这里插入图片描述
    并将其三个文件导入头部文件(头部文件右击——添加——现有项),如图

    在这里插入图片描述
    添加完成后,双击打开Java代码生成的.h文件,即com_jni_test_JNITest.h将 <jni.h>改为 “jni.h”
    在这里插入图片描述

    源文件新建个.cpp文件

    在这里插入图片描述
    简单测试 Hello , world

    #include "pch.h"     
    #include <iostream>
    #include "com_jni_test_JNITest.h"
    using namespace std;
    
    JNIEXPORT void JNICALL Java_com_jni_test_JNITest_sayHello(JNIEnv*, jclass) {
    
        cout << "Hello , world" << endl;
    }
    

    生成dll文件 (修改配置 根据自己电脑系统而定)
    在这里插入图片描述在这里插入图片描述
    生成解决方案
    在这里插入图片描述
    测试
    在这里插入图片描述
    出现Hello , world为成功
    在这里插入图片描述
    也可以将生成的.dll文件加载到项目中
    在这里插入图片描述
    测试

    在这里插入图片描述

    出现Hello , world为成功。

    展开全文
  • JNI 调用 c pp互相调用实例, java JNI cpp互相调用实例
  • java jni 传递汉字参数,包括java传入dll 从dll传出到java 包括全部 java 代码 工程文件 全部vc++6.0 Dll 代码 工程文件 找了好久资料才完成的,传上来省的大家再走弯路。
  • 通过注释自动生成c ++ JAVA JNI代码生成器支持:JNI标头+源代码,具有自动转换为c ++桥类的Java字符串转换为std :: string的桥c ++类到Java的类
  • java jni从入门到精通

    2009-08-05 21:58:56
    java JNI 技术从入门到精通 JNIJava Native Interface的缩写,中文为JAVA本地调用。从Java 1.1开始
  • Java JNI入门篇——C++访问并修改Java中的变量

    这里不在重复Java JNI 的开发过程了,不熟悉的同学请参考:Java JNI HelloWorld
    直接上主要代码:

    VarJNI.java

    package com.example.jni;
    
    public class VarJNI {
        static {
            System.loadLibrary("varjni");
        }
    
        private int number = 9;
        private String content = "I'm from Java!";
    
        public native void changeValue();
    
        public static void main(String[] args) throws Exception {
            VarJNI item = new VarJNI();
            System.out.println("before call number: " + item.number);
            System.out.println("before call content: " + item.content);
            item.changeValue();
            System.out.println("after call number: " + item.number);
            System.out.println("after call content: " + item.content);
    
        }
    
    }
    

    varjni.cpp

    // varjni.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    #include "com_example_jni_VarJNI.h"
    #include <iostream>
    #include <math.h>
    /*
    * Class:     com_example_jni_VarJNI
    * Method:    changeValue
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_com_example_jni_VarJNI_changeValue
    (JNIEnv * env, jobject obj) {
        jclass clazz = env->GetObjectClass(obj);
        jfieldID int_fieldID = env->GetFieldID(clazz, "number", "I");
        jint number = env->GetIntField(obj, int_fieldID);
        //change number value
        number = (int)pow(number, 2);
        env->SetIntField(obj, int_fieldID, number);
    
        //be careful Ljava/lang/String
        jfieldID string_fieldID = env->GetFieldID(clazz, "content", "Ljava/lang/String;");
        jstring content = (jstring)env->GetObjectField(obj, string_fieldID);
        const char* cc = env->GetStringUTFChars(content, 0);
        env->ReleaseStringUTFChars(content, cc);
    
    
        char hello[] = "I'm from C++!\n";
        jstring jhello = env->NewStringUTF(hello);
        //change content value
        env->SetObjectField(obj, string_fieldID, jhello);
        return;
    }

    这里写图片描述
    ok!

    展开全文
  • java jni 调用刷卡器

    2018-06-28 09:29:48
    技术:java使用jni调用dll库。 使用 jni控制刷卡器,可以读刷卡器的信息,通过httpClient技术给server端发消息
  • Java代码中调用C/C++代码,当然是使用JNIJNIJava native interface的简写,可以译作Java原生接口,下面看实例吧
  • JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是如何去load 一个library的 ClassLoader.c JNIEXPORT void JNICALL Java_java_lang_...

    在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是如何去load 一个library的

    ClassLoader.c  

    JNIEXPORT void JNICALL 
    Java_java_lang_ClassLoader_00024NativeLibrary_load
      (JNIEnv *env, jobject this, jstring name)
    {
        const char *cname;
        jint jniVersion;
        jthrowable cause;
        void * handle;
    
        if (!initIDs(env))
            return;
    
        cname = JNU_GetStringPlatformChars(env, name, 0);
        if (cname == 0)
            return;
        handle = JVM_LoadLibrary(cname);
        if (handle) {
            const char *onLoadSymbols[] = JNI_ONLOAD_SYMBOLS;
            JNI_OnLoad_t JNI_OnLoad;
    	int i;
    	for (i = 0; i < sizeof(onLoadSymbols) / sizeof(char *); i++) {
    	    JNI_OnLoad = (JNI_OnLoad_t) 
    	        JVM_FindLibraryEntry(handle, onLoadSymbols[i]);
    	    if (JNI_OnLoad) {
    	        break;
    	    }
    	}
    	if (JNI_OnLoad) {
    	    JavaVM *jvm;
    	    (*env)->GetJavaVM(env, &jvm);
    	    jniVersion = (*JNI_OnLoad)(jvm, NULL);
    	} else {
    	    jniVersion = 0x00010001;
    	}
    
    	cause = (*env)->ExceptionOccurred(env);
    	if (cause) {
     	    (*env)->ExceptionClear(env);
    	    (*env)->Throw(env, cause);
    	    JVM_UnloadLibrary(handle);
    	    goto done;
    	}
       
    	if (!JVM_IsSupportedJNIVersion(jniVersion)) {
    	    char msg[256];
    	    jio_snprintf(msg, sizeof(msg),
    			 "unsupported JNI version 0x%08X required by %s",
    			 jniVersion, cname);
    	    JNU_ThrowByName(env, "java/lang/UnsatisfiedLinkError", msg);
    	    JVM_UnloadLibrary(handle);
    	    goto done;
    	}
    	(*env)->SetIntField(env, this, jniVersionID, jniVersion);
        } else {
    	cause = (*env)->ExceptionOccurred(env);
    	if (cause) {
    	    (*env)->ExceptionClear(env);
    	    (*env)->SetLongField(env, this, handleID, (jlong)NULL);
    	    (*env)->Throw(env, cause);
    	}
    	goto done;
        }
        (*env)->SetLongField(env, this, handleID, ptr_to_jlong(handle));
    
     done:
        JNU_ReleaseStringPlatformChars(env, name, cname);
    }

    1. JVM_LoadLibrary 

    jvm中load library 核心函数,实现也非常简单,在linux下调用了系统函数dlopen去打开库文件,详细可参考方法

    void * os::dll_load(const char *filename, char *ebuf, int ebuflen)

    2. JVM_FindLibraryEntry 

    JVM在加载库文件时候,会去尝试查找库中的JNI_ONLOAD方法的地址,而在Linux中调用了dlsym函数通过前面的dlopen加载库的指针去获取方法的地址,而dlsym在glibc2.0是非线程安全的,需要锁的保护,虽然在java中加载库已经有锁的保护,但只是针对同一个classloader对象的细粒度锁。

    void* os::dll_lookup(void* handle, const char* name) {
      pthread_mutex_lock(&dl_mutex);
      void* res = dlsym(handle, name);
      pthread_mutex_unlock(&dl_mutex);
      return res;
    }

    3. 方法JNI_OnLoad

    JVM提供了一种方式允许你在加载库文件的时候做一些你想做的事情,也就是JNI_OnLoad方法

    在2中提到过在加载动态链接库,JVM会去尝试查找JNI_OnLoad方法,同时也会调用该函数,这样你个人可以在函数里做一些初始化的事情,比如register native方法。

    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
    {}
    JNI_OnLoad中返回的是JNI 的version,在1.6版本的情况下支持如下 

    jboolean Threads::is_supported_jni_version(jint version) {
      if (version == JNI_VERSION_1_2) return JNI_TRUE;
      if (version == JNI_VERSION_1_4) return JNI_TRUE;
      if (version == JNI_VERSION_1_6) return JNI_TRUE;
      return JNI_FALSE;
    }

    完整的加载过程就是

    首先先加载动态链接库,尝试查找JNI_OnLoad方法,并且运行方法,对我们来说从而实现可以自定义的初始化方法。



    展开全文
  • java jni简单实例

    2014-04-06 16:41:22
    该资源抱哈了一个用java实现的jni的基本实例,可以运行,包含了其中的cpp文件,简单易懂,喜欢的下载!
  • java JNI到C++中调用时候各种常见类型数据如何转换,通过程序演示Java通过JNI调用C++的API读取电脑名称和系统用户名。
  • Java JNI 入门篇——传递数组与修改数组
  • java jni教程

    2010-03-21 10:49:17
    这个是比较详细的jni教程,对大家学习java和C语言混合编程很有帮助

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,910
精华内容 59,564
关键字:

javajni

java 订阅