首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏高爽的专栏

    JNI(一):初识JNI

           通过JNI实现一个Hello world。        1. 在Java类中声明native方法,NativeTest.java。 StdAfx.cpp,会在工程所在目录debug文件夹下生成native.pch文件,这个文件在编译native.cpp的时候需要用到;然后在Header Files中引入com_ghsau_NativeTest.h、jni.h (com_ghsau_NativeTest.h需要,在jdk安装目录include下)、jni_md.h(jni.h需要,在include/win32下);最后编辑com_ghsau_NativeTest.h 、native.cpp,编辑后代码如下:        com_ghsau_NativeTest.h /* 将<jni.h>修改为"jni.h" */ #include "jni.h" /* Header 以上就是实现JNI的一套过程。

    1.1K00发布于 2017-12-28
  • 来自专栏Android小知识

    JNI

    什么是JNI java native interface java本地接口 c/c++与java之间相互调用的桥梁 为什么要学JNI java运行在虚拟机上,调用驱动需要jni来扩展他的能力 java解释型语言 ,c/c++执行效率比java快,通过jni把耗时操作放到c/c++提高运行效率 java代码编译成的.class文件安全性较差,可以通过jni把重要的业务逻辑放到c/c++编译后是汇编语言,反编译难度大 c历史悠久,1972年c 通过jni可以调用优秀的c开源类库 怎么用JNI java c/c++能看懂 会调用 jni开发流程 NDK native develop kit

    72510发布于 2019-12-13
  • 来自专栏Android技术专栏

    JNI动态注册以及JNI签名

    String stringFromJNI(); native static int add(int a,int b); }   2.注册函数:在java中加载动态库的时候,虚拟机会调用JNI 库中的JNI_Onload()函数,动态注册就是在这个函数中进行的。 结构体的定义如下: typedef struct { const char* name;//java中的方法名 const char* signature;//jni ==0){ return JNI_VERSION_1_4; //返回值代表动态库需要的jni版本 } } return -1; }   3.在java 接下来,通过一个表格来说明JNI基本类型的签名以及引用类型的签名:    特别需要注意的是,引用类型签名后面的分号;一定不能省略,否则编译通过不了。

    1K30编辑于 2023-10-22
  • 来自专栏kevindroid

    JNI简介

    什么是JNI JNI(java native interface)java本地开发接口,本质上是一种协议,相当于桥梁的作用,通过jni就可以调用C/C++代码,当然也可以用C调用java的代码。 为什么要调用JNI 通过jni技术,可以扩展android手机的功能,比如wifi热点比如NFC技术。 怎么用JNI 看懂c语言的代码 使用android ndk JNI与NDK的区别和联系 JNI是Java调用Native机制,是Java语言自己的特性全称为Java Native Interface,类似的还有微软 .Net Framework上的p/invoke,可以让C#或Visual Basic.NET可以调用C/C++的API,所以说JNI和Android没有关系,在PC上开发Java的应用,如果运行在Windows 平台使用JNI是是经常的,比如说读写Windows的注册表。

    1.5K50发布于 2018-06-20
  • 来自专栏Android 研究

    Android JNI(一)——NDK与JNI基础

    由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。 ,JNI的主要竞争优势在于:它在设计之初就确保了二进制的兼容性,JNI编写的应用程序兼容性以及其再某些具体平台上的Java虚拟机兼容性(当谈及JNI时,这里并不特比针对Davik虚拟机,JNI适用于所有 (四) JNI的三个角色 ? JNI的三个角色.png JNI下一共涉及到三个角色:C/C++代码、本地方法接口类、Java层中具体业务类。 JNI简要流程 ? PS:javah 是JDK自带的一个命令,-jni参数表示将class 中用到native 声明的函数生成JNI 规则的函数 如下图: ? JNI开发流程.png (七) JNI结构 ? JNI函数指针,这些指针指向了详细的JNI函数。

    9.2K32发布于 2018-08-30
  • 来自专栏梦里茶室

    jni note

    2016-1-15 javah 使用javah可以自动从java文件生成jni头文件,   用法:javah [选项] <类>   其中 [选项] 包括:             -help                            -d <目录>             输出目录              -o <文件>             输出文件(只能使用 -d 或 -o 中的一个)              -jni                   生成 JNI样式的头文件(默认)              -version              输出版本信息              -verbose               执行:     javah -d lib -classpath out/production/VideoSvr -jni cwh.NVR.NVRNative   关键在于找到正确的classpath,注意 -jni 类名要放在最后面写,否则会把-jni后面的东西都当做类名解析的。

    83470发布于 2017-12-29
  • 来自专栏曾大稳的博客

    jni基础

    JNI 的一般开发流程 1 定义好本地的 native 方法 2 javah 命令生成 .h 头文件 3 拷贝 xxx.h、jni_md.h、jni.h 到 VS 的工程目录并添加依赖进来 4 实现我们头文件中的 java 引入 dll 动态库运行即可 生成的 .h 文件参数详解 /* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h cplusplus } #endif #endif 实现类详解 // 实现我们的 native 方法 #include "com_darren_ndk12_NdkSimple.h" // JNIEXPORT JNI 一个关键字,不能少(编译能通过),标记为该方法可以被外部调用 // jstring : 代表 java 中的 String // JNICALL: 也是一个关键字,可以少的 jni call // 里面有如下代码 /* * JNI Native Method Interface. */ struct JNINativeInterface_; struct JNIEnv_; #ifdef

    94820发布于 2018-09-11
  • 来自专栏王小二的Android站

    JNI基础

    要看懂这些Native的代码首先要了解的是JNI JNI是什么 JNI是Java Native Interface的缩写,翻译就是JAVA本地接口,其实就是JAVA调用C/C++的一套接口 为什么使用JNI a.效率上C&C++比Java高, b.C&C++的反编译比Java难度高 c.如果之前用C&C++开发的模块,可以通过JNI来复用 但是一旦使用JNI,就会让Java失去跨平台功能,需要在不同的系统平台下编译本地语言 JNI基本使用-静态注册 ? JNI基本使用-动态注册 ? 动态注册对比静态注册 1.静态注册 编写不方便,JNI 方法名字必须遵循规则且名字很长 程序运行效率低,因为初次调用native函数时需要根据根据函数名在JNI层中搜索对应的本地函数,然后建立对应关系

    1.1K10发布于 2020-06-08
  • 来自专栏刘晓杰

    JNI入门

    JNI(Java Native Interface)它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。 接下来我将来展示一下一个简单的JNI开发 1.配置NDK环境 (这里使用最新ndk,以前做Android的项目要用到NDK就必须要下载NDK,安装Cygwin(模拟Linux环境用的),下载CDT NDKBuild"); } public native String printHello(); } 其中,loadLibrary中的参数就是LOCAL_MODULE的值 (三)编写jni 其次”javah -jni com.example.ndkbuild.Print”最后的参数是”包名+类名” 这样,在bin/classes目录下就有com_example_ndkbuild_Print.h 头文件,把它放到jni文件夹下打开 然后将头文件自动生成的方法名copy到NDKBuild.cpp中,注意加上形参 #include <jni.h> #include <string.h> #include

    1.2K20发布于 2019-02-21
  • 来自专栏深入理解Android

    JNI原理

    综述一下JNI的原理 1.通过System.loadLibrary()或System.load()加载动态库 System.load("/data/local/tmp/libgityuan_jni.so 3.2通过dlsym获取JNI_OnLoad符号所对应的方法; 3.3调用该加载库中的JNI_OnLoad()方法。 接下来便要查看libmedia_jni.so库定义所在文件,一般都是通过Android.mk文件定义LOCAL_MODULE:= libmedia_jni,可以采用grep或者mgrep来搜索包含libmedia_jni JNI原理分析 文件MediaPlayer.java中调用System.loadLibrary(“media_jni”),把libmedia_jni.so动态库加载到内存。 总之,System.loadLibrary()的作用就是调用相应库中的JNI_OnLoad()方法。接下来说说JNI_OnLoad()过程。

    1.2K10编辑于 2022-06-22
  • 来自专栏向治洪

    JNI基础

    jni开发的常见错误: 错误1: 忘记编写android.mk文件 unknown file: . 忘记配置android.mk脚本 错误3: $ ndk-build jni/Android.mk:4: 遗漏分隔符 。 停止。 ###JNI开发步骤: 创建一个android工程 JAVA代码中写声明native 方法 public native String helloFromJNI(); 用javah工具生成头文件 创建jni 输出此消息 -version 输出版本信息 -jni 生成 JNI 样式的标头文件 (默认值) -force 在jni文件夹中编写android.mk文件,在这个文件夹中声明要编译的c文件名以后编译后生成的文件名 ```c LOCAL_PATH := $(call my-dir) //将jni所在的目录返回去到

    1.7K100发布于 2018-01-26
  • 来自专栏流媒体

    Jni教程(一)—Linux下jni调用简介

    简介 开发环境 代码结构 .h文件生成 编译生成so文件 运行 扩展(有包名的情况) 开发环境 centos 6.8 ×64 [root@localhost jni]# cat /proc/version GCC) ) #1 SMP Tue Sep 12 14:33:29 UTC 2017 jdk 1.8 目录 /usr/local/java/jdk1.8.0_144 [root@localhost jni javah JavaMain.java 生成JavaMain.h头文件 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h java.library.path classpath是指向jar包的位置 java.library.path是非java类包的位置如(dll,so) 结果: [root@localhost jni /src/main/jni */

    2.5K30发布于 2018-08-23
  • 来自专栏Flutter入门到实战

    JNI源码分析 (并实现JNI动态注册)

    ", nullptr); // 拿到JNI_OnLoad方法 if (sym == nullptr) { VLOG(jni) << "[No JNI_OnLoad found in \"" JNI_OnLoadFn jni_on_load = reinterpret_cast<JNI_OnLoadFn>(sym); int version = (*jni_on_load)(this These are the only other valid versions. // 当不等于JNI_VERSION_1_2 或 JNI_VERSION_1_4 或 JNI_VERSION_1_ = JNI_VERSION_1_2 && version != JNI_VERSION_1_4 && version ! ; } return JNI_TRUE; } JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { LOGI("jni_OnLoad

    2K10发布于 2018-09-03
  • 来自专栏构建FFmpeg Android播放器

    JNI介绍

    1 JNI定义 JNI(Java Native Interface),即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互. 以下是oracle对JNI的定义 JavaTM Native Interface (JNI) is a standard programming interface for writing Java 更多oracle关于JNI的介绍可以参考 Java 原生接口规范 2 JNI介绍 Java语言的执行环境是Java虚拟机(JVM),JVM其实是主机环境中的一个进程,每个JVM虚拟机都在本地环境中有一个 JavaVM结构体,该结构体在创建Java虚拟机时被返回,在JNI环境中创建JVM的函数为JNI_CreateJavaVM。 Native code通过JNI Function来访问Java VM的功能. JNI Function可以通过接口指针JNIEnv*来访问, 该指针指向一个指针数组,每个指针指向一个接口函数。

    1.1K10发布于 2020-07-22
  • 来自专栏刘晓杰

    JNI编程demo

    一般来讲用java也能做,但这次用jni来做 先定义一个操作类 public class ProgressBarOperation { static { System.loadLibrary setPressure(pressure); } cpp文件代码如下 //生成随机数 int getPressure() { return rand() % 100; } int flag = JNI_TRUE Java_com_example_pressuretest_ProgressBarOperation_stopMonitor( JNIEnv *env, jobject obj) { flag = JNI_FALSE jint width, jint height, jint threshold) { jint *cbuf = env->GetIntArrayElements(buffer, JNI_FALSE

    47740发布于 2019-02-21
  • 来自专栏linux驱动个人学习

    Android 增加JNI

    Android:JNI 与 NDK到底是什么?(含实例教学) 前言 在android开发中,使用NDK开发的需求正逐渐增大; 很多人搞不懂JNI与NDK到底是怎么回事? 或 C、C++代码调用 Java 代码 特别注意: JNI是 Java 调用 Native 语言的一种特性 JNI 是属于 Java 的,与 Android 无直接关系 1.2 为什么要有JNI 背景 NDK与JNI关系 4. ("Hello i am from JNI!") 文件夹 若无jni文件夹,则手动创建。

    2.2K40编辑于 2022-05-10
  • 来自专栏Android开发实战

    JNI开发总结

    /archive/2013/05/23/3092491.html JNI中C调用java的方法:http://www.cnblogs.com/xitang/p/4174619.html JNI读取应用签名 1.必须遵循某些规则 2.名字过长 3,多个class需Javah多遍, 4.运行时去找效率不高 动态注册 : 在JNi层实现的,JAVA层不需要关心,因为在system.load时就会去掉JNI_OnLoad 下面要做的就是怎么在JNI调用这些方法。 内存管理 JNI内存管理请参考:https://www.ibm.com/developerworks/cn/java/j-lo-jnileak/ JNI 编程实现了 native code 和 Java 程序的交互,因此 JNI 代码编程既遵循 native code 编程语言的编程规则,同时也遵守 JNI 编程的文档规范。

    1.9K41发布于 2018-10-22
  • 来自专栏Android 进阶

    JNI 异常处理

    中,由于JNI没有像Java一样有try...catch...final这样的异常处理机制,面且在本地代码中调用某个JNI接口时如果发生了异常,后续的本地代码不会立即停止执行,而会继续往下执行后面的代码 ; 处理异常的方式 ExceptionCheck ExceptionOccurred ExceptionCheck 调用了JNI的ExceptionCheck函数检查最近一次JNI调用是否发生了异常,如果有异常这个函数返回 JNI_TRUE,否则返回JNI_FALSE //异常捕获 ,检查JNI调用是否有异常 if(env->ExceptionCheck()){ env->ExceptionDescribe 函数后,必须先检查、处理、清除异常后再做其它 JNI 函数调用,否则会产生不可预知的结果; 一旦发生异常,立即返回,让调用者处理这个异常。 或 调用 ExceptionClear 清除异常,然后执行自己的异常处理代码; 异常处理的JNI函数: ExceptionCheck:检查是否发生了异常,若有异常返回JNI_TRUE,否则返回JNI_FALSE

    1.2K10发布于 2019-12-25
  • 来自专栏全栈程序员必看

    JNI总结(一)

    JNI 是 Java平台中的一个强大特性。应用程序能够通过 JNI把 C/C++代码集成进 Java程序中。通过 JNI。开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资。 JNI让你在利用强大 Java平台的同一时候,使你仍然能够用其它语言敲代码。 作为 JavaVM 的一部分,JNI 是一套双向的接口。同意 Java 与本地代码间的互操作。 作为双向接口。 JNI 支持两种类型本地代码:本地库和本地应用。 用 JNI 实现却要几百行 当你准备在项目中使用 JNI之前。请先考虑一下是否有其它更合适的方案。上节有关 JNI缺点的介绍,应该引起你足够的重视。 虚拟机实现者通过 JNI 支持大量的本地代码工具开发商不用处理不同种类的本地接口全部 JNI 开发人员面对的是操作 JavaVM 的规范 APIJNI 的首次支持是在 JDK release 1.1,但

    45010编辑于 2022-07-10
  • 来自专栏包子的书架

    JNI的探索

    JNI的概念 定义 JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植 原理 ? 4、将生成的头文件放置到vs新建的项目,如下; 还需要将JDK目录下的include 目录下的jni.h 和 jni_md.h文件copy到项目 因为生成的JniMain.h文件需要依赖到这两个文件, 同时将JniMain.h中的 #include <jni.h> 改成 #include "jni.h" ? 调用的分析 JNI的数据类型 JNI基本数据类型: java C/C++ boolean jboolean byte jbyte char jchar short jshort int jint long 对应的java属性与方法签名 在jni调用中,返回值和参数,以及静态字段和实例字段,有对应着相应的签名,如下表格: 这些签名的时候在接下的实例讲解中会用到; 简而言之,在jni中涉及到类型的使用(包括基本类和引用类型

    1.3K20发布于 2020-06-16
领券