Android 做jni的时候 需要根据native java类生成对应的.h头文件,然后根据.h头文件写cpp文件。
java开发中如果使用到JNI,则难免需要使用javah来生成C++或C的头文件信息,下面就讲解javah的命令:
学习jni的时候,javac Helloworld.java 生成 Helloworld.class文件以后,调用javah Helloworld提示找不到类文件
大家好,又见面了,我是你们的朋友全栈君。 今天看了《android框架揭秘》一书中的jni这块,按照书上的写法试了试javah命令, 今天通过javah生成h文件时遇到各种问题。不管是javah -classpath参数啊还是别的什么,一直都无法成功通过class文件生成h文件。
最近由于项目需要重新开始学习JNI。上一篇文章(http://blog.csdn.net/lxj1137800599/article/details/51594954)有一个步骤是生成头文件,我嫌麻烦,就去寻找简便方法,发现还是有的。只要进行一些配置就行。 具体步骤如下: (1)点击图中红色部分
最近需要使用JNI编程,学了下JNI,并且在Android Studio下实现了一个小demo。这期间有一些坑,还好都解决了,想分享出来,希望大家少走弯路。本文中采用的平台是Windows,NDK环境已经搭建好,这方面资料很多,大家可以自行百度。
测试文件:hello-jni/src/com/example/hellojni/HelloJni.java
摘要总结:
从前文所知,JNI是Java调用native(c/c++)一个中间接口,本文将介绍JNI的基本规范和操作实践。
javah –help输出内容采用的是utf-8编码,在cmd打开可能出现乱码,因此执行指令chcp 936,指定编码字符集(cmd默认的字符编码集是GBK)
最近在写c++/c的一个小的项目,需要打成动态库,供java使用。就对java 调用c++/c代码做了简答了解,在此做记录。jni开发第一步,就是用javah命令生成生成c\c++头文件。
当Linux中有多个jdk版本的时候,可能会导致运行时错误,这时需要将javac和java的版本调成一致,即编译时版本和运行时版本要相同。
native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。 Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。
Step: 1. 添加native接口注意写好native接口和System.loadLibrary()即可了,并无特别之处。 Step: 2.执行Build->Make Project 生成了.class文件..class文件的生成路径是在 app_path/build/intermediates/classes/debug下的. 这个在android studio里面看不到, 到文件管理器里面翻到的, 里面还有好多东西。 Step: 3.javah生成c头文件 点击"View->To
工作中需要用到java调用DES加密解密算法进行通信加密、MAC计算等,原来直接有C语言版的DES算法库可以用,但是java用的不熟,java的DES算法库没用过,就想到把C语言的DES算法库编译成DLL,然后通过java的JNI调用。
1.无法确定AssetManager的签名 这是因为native函数中存在不常用的类,而我们需要,唯一的方法就是从sdk中取出android.jar,后缀名改成rar,然后解压到某个目录,最后在javah中添加bootstrapclass指令
进入hadoop-hdfs-project/hadoop-hdfs/src目录,执行cmake以生成Makefile文件。 如果遇到如下的错误: ~/hadoop-2.7.1-src/hadoop-hdfs-project/hadoop-hdfs/src]$ cmake . JAVA_HOME=, JAVA_JVM_LIBRARY=/data/jdk/jre/lib/amd64/server/libjvm.so JAVA_INCLUDE_PATH=/data/jdk/include, JAVA_INCLUDE_PATH2=/data/jdk/include/linux Located all JNI components successfully. CMake Error at CMakeLists.txt:84 (MESSAGE): You must set the CMake variable GENERATED_JAVAH -- Configuring incomplete, errors occurred! 则指定一下cmake参数即可,如下所示: cmake -DJAVA_HOME=/data/jdk -DGENERATED_JAVAH=/data/jdk . 然后带参数再次执行cmake: ~/hadoop-2.7.1-src/hadoop-hdfs-project/hadoop-hdfs/src]$ cmake -DJAVA_HOME=/data/jdk -DGENERATED_JAVAH=/data/jdk . 下面的显示表示cmake成功,会在当前目录下生成Makefile文件: JAVA_HOME=/data/jdk, JAVA_JVM_LIBRARY=/data/jdk/jre/lib/amd64/server/libjvm.so JAVA_INCLUDE_PATH=/data/jdk/include, JAVA_INCLUDE_PATH2=/data/jdk/include/linux Located all JNI components successfully. -- Found PkgConfig: /usr/bin/pkg-config (found version "0.23") -- checking for module 'fuse' -- package 'fuse' not found -- Failed to find Linux FUSE libraries or include files. Will not build FUSE client. -- Configuring done -- Generating done -- Build files have been written to: /data/hadoop-2.7.1-src/hadoop-hdfs-project/hadoop-hdfs/src 接下来就可以执行make来编译生成libhdfs.a了。
4.使用javac命令将HelloWorld.java进行编译,然后使用javah -jni命令编译获取jni所需要的头文件
/bin/bash: jar: command not found 解决办法: cd /usr/bin 必须先进入/usr/bin,下同 sudo ln -s -f /usr/lib/jvm/jdk1.6.0_30/bin/jar 我的jdk是安装在/usr/lib/jvm/jdk1.6.0_30/目录下的 如果提示javah:commond not found,于是照葫芦画瓢,输入命令 cd /usr/bin ln -s -f /usr/lib/jvm/jdk1.6.0_30/bin/javah
我的android sdk路径为(前面有环境变量路径一定要加;) ;E:\Program Files\Android\Android Studio\plugins\android\lib\android.jar; 第三步,编译java文件 javah 完整包名+类名 例如: javah com.jni.demo.jni_01 com.jni.demo为完整包名,因为jni的语法实现需要用到完整包名,它会自动在项目的相对路径下寻找相应的类文件 jni_01是含有native方法的类
3 月 20 日,Oracle 宣布 Java 10 正式发布。 官方已提供下载:http://www.oracle.com/technetwork/java/javase/downloads/ind
在生成Java头文件时报错,经查询发现新版的Java不使用javah的命令了,而是使用javac -h 用法:
之前的文章说明了使用文件夹管理来代替原来的当个命令配置的方式,不过这个是属于个人使用的方式,并不是规范的通用的方式。
在 Java 9 之后,Java 将采用基于时间发布的策略,每 6 个月一个版本。目前,Java 10 的新特性都已经确定。
上一篇博客,已经搭建好了windows下的linux环境(cygwine),这次我们试着写一个hello world。首先需要去android的官网下载android-ndk压缩包,之后解压,进入解压后的目录,我们发现有一个ndk-build的脚本文件,这个脚本文件就是我们用交叉编译的文件。我们通过 “./ndk-build” 来运行该命令,如下图:
按照网上配置java环境变量的方法在/etc/profile文件中添加如下内容,配置之后,如果重启系统后切换到root用户无法获取已配置的java环境变量,在普通用户下可以获取到
1,cmd切换到应用工程目录下如示例中的D:\zxy\IDCardQualityLib
安装方式: 1):通过ppa(源) 方式安装. 2):通过官网安装包安装.JDK官网下载地址
代码很简单,native来声明该方法非java方法。static代码块来加载动态库。
将手机通过USB连接到电脑,adb shell进入手机根目录,执行cat /proc/cpuinfo
(注:如果下载不下来,建议使用迅雷下载,然后拷贝到Linux系统上。)
摘要 本文为在 32 位 Windows 平台上实现 Java 本地方法提供了实用的示例、步骤和准则。本文中的示例使用 Sun Microsystems 公司创建的 Java Development
前言 前面介绍过如何实现在Android Studio中制作我们自己的so库,相信大家看过之后基本清楚如何在Android studio创建JNI函数并最终编译成不同cpu架构的so库,但那篇文章介绍注册JNI函数的方法(静态方法)存在一些弊端,本篇将介绍另外一种方法(动态注册)来克服这些弊端。 注册JNI函数的两种方法 静态方法 这种方法我们比较常见,但比较麻烦,大致流程如下: 先创建Java类,声明Native方法,编译成.class文件。 使用Javah命令生成C/C++的头文件,例如:javah -
以Android studio 4.0.2来分析讲解,gradle=6.1.1,如图文和网上其他资料不一致,可能是别的资料版本较低而已
为什么会有本地接口的概念呢?我们在之前的文章说过Java语言不是面向硬件的,它无法直接调用操作系统API操控硬件,Java和硬件的交互正常都是通过JVM提供的API来完成的,但是当虚拟机提供的API不足以实现我们个别需求的时候,就需要本地接口了。由于JVM底层就有C++的影子,所以JVM也提供了JNI(Java本地接口:Java Native Interface,)技术作为其它语言(主要是C/C++)通信的API。在本地接口的相关的概念里,Java成为了一个调用方,其他语言成为了主角,这篇文章我们以C++为例,看一下如何调用本地接口,关于C++的部分尽可能简单的描述,如果大家还有疑问可以了解一些C++的基本知识。
前面一直想看该JNI的相关内容,但是发现JNI的资料还是偏少。后面发现JNI在安全中应用非常的微妙,有意思。
1.下载用于Ubuntu的Oracle JAVA JDK 选择正确的版本,记得做一次MD5效验。
最近在调试 车辆识别demo,说实话,虽然最初接触jni的时候,是在eclipse工程中进行开发的, 不过后面遇到的项目都是直接放到了android 源码中编译的,所以对于在eclipse中的ndk开发,其实记忆有点模糊了,包括 Android.mk的编写,都有点小区别吧。
1. JNI概述 JNI 是 Java Native Interface 的简称 Java是跨平台的编程语言,但是在有些时候仍然是有需要调用本地代码(这些代码通常是由 C 与 C++ 编写的)。 JNI 是 Java 平台的一个功能强大的接口。这个 JNI接口提供了Java与操作系统本地代码相互调用的功能。 2. C/C++代码的步骤 在 Java 类中声明一个native方法 public native void sayHello(); 使用 javah 命令生成包含 native 方法声明的C/C++
静态注册: 每个class都需要使用javah生成一个头文件,并且生成的名字很长书写不便;初次调用时需要依据名字搜索对应的JNI层函数来建立关联关系,会影响运行效率 用javah 生成头文件方便简单 动态注册: 使用一种数据结构JNINativeMethod来记录java native函数和JNI函数的对应关系 移植方便(一个java文件中有多个native方法,java文件的包名更换后)
ubuntu 安装jdk 的两种方式: 1:通过ppa(源) 方式安装. 2:通过官网下载安装包安装. 这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级 使用ppa/源方式安装 1.添加ppa sudo add-apt-repository ppa:webupd8team/java sudo apt-get update 2.安装oracle-java-installer jdk8 sudo apt-get install oracle-java8-installe
一. 简述 Android中的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发中。
JNI基础 将java中的字符串转换成C中字符串的工具方法 char* Jstring2CStr(JNIEnv* env, jstring jstr){ char* rtn = NULL; jclass clsstring = (*env)->FindClass(env,"java/lang/String"); jstring strencode = (*env)->NewStringUTF(env
reference https://www.cnblogs.com/liuling/p/2013-12-20.html
在网上看到各种帖子谈论java的native方法,这是java用来弥补其运行速度慢而利用C的措施,可以说是java与C/C++的接口,但是网上这类帖子太多而且讲述的方法都很复杂,今天我想总结一下。 步骤: 1.写一个java类,例如下面的HelloWorld.java public class HelloWorld { private native void print(); static { System.loadLibrary("Hello"); } public stat
(1)打开as的Terminal,输入cd app/src/main/java (2)通过javah生成头文件:javah -d ../jni -jni test.ndkdemo.PrintUtil(包名+类名,而且不要再MainActivity里面定义native函数) 参考:http://blog.csdn.net/lvxiangan/article/details/52348975
G1 是设计来作为一种低延时的垃圾回收器。G1收集器还可以进行非常精确地对停顿进行控制。从JDK7开始启用G1 垃圾回收器,在JDK9中G1成为默认垃圾回收策略。截止到ava 9,G1的Full GC采用的是单线程算法。也就是说G1在 发生Full GC时会严重影响性能。
配置NDK环境,进行简单Native开发 NDK下载 环境变量配置 为ndk和jdk配置环境目录保证javah命令和ndk-build命令可以直接在命令行使用。 为AndroidStudio工程配置NDK路径 打开local.properties文件,添加ndk目录: sdk.dir=C\:\\Users\\realhe\\AppData\\Local\\Android\\Sdk ndk.dir=D\:\\ndk\\android-ndk-r10c 打开build.gradle,在defaultConfig
方式一: windows平台下可以直接访问这个地址 直接下载带有 java插件的 vscode 方式二: 在vscode中下载以下插件
初遇 初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: 1public native int hashCode(); 为什么有个native呢?这是我所要学习的地方。所以下面想要总结下native。 一、认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Jav
领取专属 10元无门槛券
手把手带您无忧上云