JNI

eclipse调用jni

廉价感情. 提交于 2020-03-07 22:06:52
http://blog.chinaunix.net/uid-27003388-id-3235189.html 1. 在Eclipse里创建一个Java project(jni_test); 在src里创建一个package,取名为jni; 然后在jni里创建一个带有native声明的方法的java类(helloworld.java),文件具体内容如下: package jni; public class helloworld { static { System. loadLibrary ( "helloworld"); } public native void dispHelloWorld(); /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //System.getProperty("java.library.path"); new helloworld().dispHelloWorld(); } } Eclipse工程树形图如下: 2.生成JNI头文件 在命令行里,cd到Java工程(jni_test)的src目录,例如: cd E:\workspace\jni_test\src 然后执行javah -jni jni

JNI的简单使用

心已入冬 提交于 2020-03-07 22:06:18
JNI的简单使用 以一个最简单的HelloWorld程序来介绍一下JNI的最基本的使用方法: 1)首先要有一个HelloWorld.java。 这个是主文件,里面包括本地方法的java声明,一个main函数,还有一个静态代码段,用来导入所需要的动态连接库(在windows里是.dll)。 代码如下: //HelloWorld.java class HelloWorld { public native void displayHelloWorld();//注意关键字native,这就说明这个方法是用本地方法实现的。 static {//静态代码段里面导入了hello.dll。 System.loadLibrary("hello"); } public static void main(String[] args) {//调用本类的displayHelloWorld方法,(当然了方法实际上是用c语言实现的) new HelloWorld().displayHelloWorld(); } } 2)编译HelloWorld.java。 使用语句为:、 javac HelloWorld.java 3)使用javah命令生成一个.h文件。 使用语句为:、 javah HelloWorld 这就是实现displayHelloWorld()方法的c文件的头文件。文件名为HelloWorld

JNI入门(上)

拥有回忆 提交于 2020-03-07 22:05:55
reverocean 原创 1. 简介 JNI是Java Native Interface的缩写,它的设计目的是:  The standard Java class library may not support the platform-dependent features needed by your application.  You may already have a library or application written in another programming language and you wish to make it accessible to Java applications  You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions 2. JNI的书写步骤  编写带有native声明的方法的java类  使用javac命令编译所编写的java类  使用javah ?jni java类名生成扩展名为h的头文件  使用C/C++实现本地方法

JNI学习1

两盒软妹~` 提交于 2020-03-07 22:05:21
java是跨平台的语言,但是在有些时候仍然是有需要调用本地代码(通常由c/c++编写) sun公司提供的JNI是java平台的一个功能强大的接口。这个JNI接口提供了Java与操作系统本地代码相互 调用的功能。 Java中调用C/C++代码的步骤: 首先在java类中声明一个native方法。 bin/javah.exe 生成相应的c/c++头文件 按照生成的头文件编写对应的c/c++代码 编译生成dll 把dll文件加入到PATH环境变量下。 Java类中加载DLL,然后调用声明的Native方法。 使用JNI的两个弊端: 使用了JNI,那么这个Java Application将不能跨平台了。如果要移植到别的平台上,那么native代码就需 要重新进行编写。 Java是强类型的语言,而c/c++不是。因此,你必须再写JNI时更小心。 相关文件 TestNative.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class TestNative */ #ifndef _Included_TestNative #define _Included_TestNative #ifdef __cplusplus extern "C" { #endif /* *

JNI/NDK:CMakeLists.txt 构建so库,导入三方so库,以及遇到的坑

懵懂的女人 提交于 2020-03-06 12:40:19
https://blog.csdn.net/dengweijunkedafu/article/details/89218863?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 本文使用最新的JNI构建工具CMake完成 通过这篇文章,你讲学习到: camke构建自己的三方so库 学会使用cmake管理自己jni文件 学会使用cmake调用三方的so库 最后分析自己开发过程中遇到的坑 1.CMakeLists.txt 构建so库 创建jni的工具类JNI : 这个类的原本用途是,在工程里用来管理jni的方法,和加载so库用的 但是在这里仅仅只是为了加载so库 package com.bendeng.jnindk; /** * @author: dwj<br> * @date: 2019/4/10 15:39<br> * @desc: <br> */ public class JNI { // Used to load the 'test-lib' library on application startup. static { // 一定要加这一句,否不会生成so库 System.loadLibrary("test-lib"); } }

用djinni自动生成JNI相关文件

只谈情不闲聊 提交于 2020-03-06 11:36:31
一、djinni是什么 djinni是个工具,用来生成JNI相关接口。现在很多人都是只懂java,或者只懂C++,很少有人两头都精通;即使两头都精通,自己写JNI接口也很复杂。这时候djinni就能很好的解决这些问题,我们只要按要求配置JNI接口的对象,就能生成两边的接口。除了java与C++,还能生成ObjC与C++等接口。 二、环境 java 1.8.0_101 djinni GitHub地址 msys2下载地址 因为djinni中的一些命令是linux中的命令方式,所以要下载个msys2,在msys2中运行 下载好后打开msys2,cd到djinni根目录下,输入以下命令来拉取库(整个过程时间很长) src/run --help 三、编写djinni配置文件 配置文件中可以配置如下的接口,在C++中具体实现,然后被java或ObjC或其他语言调用 # This interface will be implemented in C++ and can be called from any language. my_cpp_interface = interface +c { method_returning_nothing(value: i32); method_returning_some_type(key: string): another_record; static

JVM源码分析之不可控的堆外内存

我怕爱的太早我们不能终老 提交于 2020-03-05 13:27:10
概述 之前写过篇文章,关于堆外内存的, JVM源码分析之堆外内存完全解读 ,里面重点讲了DirectByteBuffer的原理,但是今天碰到一个比较奇怪的问题,在设置了-XX:MaxDirectMemorySize=1G的前提下,然后统计所有DirectByteBuffer对象后面占用的内存达到了7G,远远超出阈值,这个问题很诡异,于是好好查了下原因,虽然最终发现是我们统计的问题,但是期间发现的其他一些问题还是值得分享一下的。 不得不提的DirectByteBuffer构造函数 打开DirectByteBuffer这个类,我们会发现有5个构造函数 DirectByteBuffer(int cap); DirectByteBuffer(long addr, int cap, Object ob); private DirectByteBuffer(long addr, int cap); protected DirectByteBuffer(int cap, long addr,FileDescriptor fd,Runnable unmapper); DirectByteBuffer(DirectBuffer db, int mark, int pos, int lim, int cap,int off) 我们从java层面创建DirectByteBuffer对象

【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )

南笙酒味 提交于 2020-03-05 00:05:41
文章目录 I . Native 调用 Java 方法 II . JNIEnv *env 与 jobject instance III . JavaVM *vm IV . 局部引用 与 全局引用 分析 V . Native 调用 Java 方法 ( 主线程 ) VI . Native 调用 Java 方法 ( 子线程 ) VII . Java 层方法 VIII . C++ Java 调用助手类 ( JavaCallHelper.h 头文件 ) IX . C++ Java 调用助手类 ( JavaCallHelper.cpp ) X . Native 入口 C++ 方法 I . Native 调用 Java 方法 1 . 前置知识点 : 参考 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 ) 博客内容 , 了解如何在 C++ 中调用 Java 方法 ; 2 . Native 调用 Java 方法 流程如下 : ① 获取函数签名 : 查找字节码文件 , 使用 javap 获取函数签名 ; ② 反射获取 Java 方法 : 通过调用 jmethodID GetMethodID(jclass clazz, const char* name, const char* sig) 方法获取方法 ID ; ③

Android JNI开发之NDK环境搭建

自古美人都是妖i 提交于 2020-03-03 14:00:04
参考:http://www.cnblogs.com/yejiurui/p/3476565.html 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要为Eclipse Android工程添加一个Builders,而为Eclipse配置的builder,其实就是在执行Cygwin,然后传递ndk-build作为参数,这样就能让Eclipse自动编译NDK了。那么我们现在开始吧: 一、关于NDK的一点解释: NDK全称:Native Development Kit。 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 二、 NDK 坏境搭建: 注意事项:目前已经出了NDK-r9b了

NDK学习三: 纯手工编译Hello World

孤人 提交于 2020-03-03 13:58:34
ndk学习之旅 http://blog.csdn.net/pathfinder163/article/details/7178909 http://www.cnblogs.com/yejiurui/p/3476565.html 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要为Eclipse Android工程添加一个Builders,而为Eclipse配置的builder,其实就是在执行Cygwin,然后传递ndk-build作为参数,这样就能让Eclipse自动编译NDK了。那么我们现在开始吧: 一、关于NDK的一点解释: NDK全称:Native Development Kit。 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。