Linux version 2.6.32-696.10.2.el6.x86_64 (mockbuild@c1bl.rdu2.centos.org) (gcc version 4.4.7 20120313...o $@ $+ -fPIC -shared -I/usr/local/java/jdk1.8.0_144/include -I/usr/local/java/jdk1.8.0_144/include/linux...引入jni相关的头文件。...linux下库文件有个特点就是固定以lib开头,.so为扩展名。 运行 得到so文件后,接下来就编译JavaMain.java。.../src/main/jni */
JNIEXPORT 与 JNICALL 宏定义 ---- JNIEXPORT 与 JNICALL 是 JNI 中定义的两个宏 : ① Windows 平台宏定义 : #ifndef _JAVASOFT_JNI_MD_H..._JAVASOFT_JNI_MD_H_ */ ② Linux 平台宏定义 : #define JNIIMPORT #define JNIEXPORT __attribute__ ((visibility...) void __stdcall Java_kim_hsl_jni_Main_jniTest (JNIEnv* env, jobject instance, jint i, jstring s_) {...Java_kim_hsl_jni_Main_jniTest (JNIEnv* env, jobject instance, jint i, jstring s_) { } ② 编译过程中宏替换后的代码...env, jobject instance, jint i, jstring s_) { }
本文分别在windows环境和linux环境下介绍如何实现该技术。...JNICALL Java_com_woniu_Native_NativeCpp_fun2 (JNIEnv *, jobject, jint, jint); /* * Class: com_woniu_Native_NativeCpp...JNICALL Java_com_woniu_Native_NativeCpp_fun2 (JNIEnv *, jobject, jint a, jint b) { return a...JNICALL Java_com_woniu_Native_NativeCpp_fun2 (JNIEnv *, jobject, jint a, jint b) { return...-I /usr/java/jdk1.8.0144/include/ -I /usr/java/jdk1.8.0144/include/linux/ g++ -shared jni.o -o jni.so
JNI原本是Java的产物,Java希望代码能够夸平台使用 不同平台动态库的后缀并不一样 Linux下是.so Windows下是.dll 因此,为了适应不同的平台,这里传入的参数去掉了和系统相关的部分...JNI_OnLoader函数的原型如下: jint JNI_OnLoad(JavaVM* vm, void*) 复制代码 在JNI_OnLoader函数中,最重要的一件事就是调用registerNativeMethods...JNI类,并按照JNINativeInterface中的函数名来实现 class JNI { public: static jint GetVersion(JNIEnv*) { return...函数中将使用Linux的线程函数来创建一个新线程。...如果要在JNI中抛出异常,JNIEnv也提供了两个函数,如下所示: jint Throw(jthrowable obj); jint ThrowNew(jclass clazz, const
JNIEXPORT 和 JNICALL 的作用 因为安卓是跑在 Linux 下的,所以从 Linux 下的jni_md.h头文件可以看出来,JNIEXPORT 和 JNICALL 是一个空定义,所以在...Linux 下 JNI 函数声明可以省略这两个宏。 .../* * System.loadLibrary()时调用 * 如果成功返回JNI版本, 失败返回-1 */ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void...版本, 失败返回-1 */ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL;...jint result = -1; if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) !
其中jin.h又包含了jni_md.h /usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux 2.实现C函数 3.将C函数加入到映射数组中 4.实现JNI_OnLoad...// jint表示JNI的int类型,在本文后面会给出所有JNI类型 jint add(JNIEnv *env, jobject thiz, jint a, jint b) { return...fPIC -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/ -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux...: Java_包名_类名_Java方法名 jint Java_cn_caiyifan_jni_Hello_addFromC(JNIEnv *env, jobject thiz, jint a, jint...fPIC -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/ -I/usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux
return; } 4、GCC编译生成共享库(libhello.so),执行如下命令: gcc -Wall -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\linux...jint (*DetachCurrentThread)(JavaVM*); jint (*GetEnv)(JavaVM*, void**, jint);...() { return functions->DetachCurrentThread(this); } jint GetEnv(void** env, jint version)...JNI类型是一个指向全部JNI方法的指针。...为了为了解决这个问题,JNI提供了查询可用引用容量的方法jint EnsureLocalCapacity(JNIEnv *env, jint capacity),我们在创建超出限制的引用时最好先确认是否有足够的空间
(JNIEnv *, jobject, jint, jint); -- c....是在windows系统中的cygwin使用的, android-ndk-linux 是在linux下使用的; 2....的根目录; 对应的linux目录 : 这两个目录进行对比发现, 两个目录是一样的, Cygwin的安装目录就是 linux根目录; cygdrive目录 : 该目录是Cygwin模拟出来的windows...版本NDK :android-ndk-r9c-linux-x86.tar.bz2(32位) , android-ndk-r9c-linux-x86_64.tar.bz2 (64位) , 该版本直接在linux...JNI数据类型 Java数据类型 C数据类型 JNI数据类型对比 : 32位 与 64位机器可能会有出入; Java数据类型 C本地类型 JNI定义别名 int long jint/jsize long
做过jni开发的同学都知道jni代码是使用ndk工具链编译的,ndk工具中就包含交叉编译工具链,我们先看一下ndk的目录结构: 这些目录表示针对不同CPU架构的编译工具链,例如arm-linux-androideabi...arm-linux-androideabi-g++ : 编译cpp文件的交叉编译器 arm-linux-androideabi-addr2line : 反解出堆栈的工具,Android上的Native...return functions->DetachCurrentThread(this); } jint GetEnv(void** env, jint version) { return functions...JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved); JNIEXPORT void JNI_OnUnload(JavaVM* vm, void*...JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env; if (vm->GetEnv(reinterpret_cast
JAVA CAS实现原理 JAVA中的CAS是通过调用JNI(JNI:Java Native Interface为JAVA本地调用,允许java调用其他语言)的代码实现的。...下面的 jboolean、jlong 和 jint 等是一些类型定义(typedef): * * jni.h * typedef unsigned char jboolean; *...这里的 offset 就是 AtomaicInteger 中的 valueOffset jint* addr = (jint *) index_oop_from_field_offset_long(...相关的预编译逻辑如下: * * atomic.inline.hpp: * #include "runtime/atomic.hpp" * * // Linux...* #ifdef TARGET_OS_ARCH_linux_x86 * # include "atomic_linux_x86.inline.hpp" * #endif
这是JNI实现源码分析系列文章中的一部分,本系列文章结合Dalvik源码来说明JNI实现上的细节,本系列包括: JNI实现源码分析【一 前言】 JNI实现源码分析【二 数据结构】 JNI实现源码分析...【三 间接引用表】 JNI实现源码分析【四 函数调用】 JNI实现源码分析【五 结束语】 正文 在展开深入讨论之前,先说一下Dalvik中和JNI相关的数据结构,是很有必要的。...需要的数据结构 虚拟机在实现JNI时,需要一些特殊的结构。...有管理虚拟机的,有JNI操作相关的。比如我们知道在JNI的API中就有两个重要的结构:JavaVM,JNIEnv a....0x04: JNI参数传递的数据结构 方法调用少不了参数传递:入参和返回值,在JNI中,并不是直接将虚拟机中的Object暴露给API,而是使用了形如jobject这样的结构,为何?
(JNIEnv *env,jclass clazz,jint a,jint b){ return a/b; } 最后,然后加入引用,如下: #include #include...所以我们在jnitools.c中重写函数这个函数,如下: JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){ return JNI_VERSION...,"JNITag","enter jni_onload"); JNIEnv* env = NULL; jint result = -1; // 判断是否正确 if((...*env,jclass clazz,jint a,jint b); JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){ _...-1; } return JNI_VERSION_1_6; } jint addNumber(JNIEnv *env,jclass clazz,jint a,jint b){
" #include "utils/Log.h" #include "utils/misc.h" #include "core_jni_helpers.h" #include #include...android_os_fileobserver_init(JNIEnv* env, jobject object) { #if defined(__linux__) return (jint)...android_os_fileobserver_startWatching(JNIEnv* env, jobject object, jint fd, jstring pathString, jint...fd, jint wfd) { #if defined(__linux__) inotify_rm_watch((int)fd, (uint32_t)wfd); #endif } static...linux下可以使用fork函数,fork函数用于产生一个新的进程,函数返回值pid_t是一个整数,在父进程中,返回值是子进程编号,在子进程中,返回值是0。
通过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" */ #include "jni.h" /* Header...以上就是实现JNI的一套过程。
调用 JavaVM / _JavaVM 结构体的 jint GetEnv(void** env, jint version) 方法 // 返回值分析 : 动态注册会返回一个结果...注册方法数组 jint nMethods //要注册的 JNI 方法个数 ) sizeof...These are * called by JNI, not provided by JNI. */ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved...** env : JNIEnv 的二级指针 ; jint version : JNI 的版本 , 一般传入 JNI_VERSION_1_6 ; ② 返回值说明 : 返回动态注册结果 ; 动态注册成功 :...注册方法数组 jint nMethods //要注册的 JNI 方法个数 ) sizeof
和 JNI_TRUE 宏定义 ; #define JNI_FALSE 0 #define JNI_TRUE 1 III ....jint 数组首元素地址 ; jint 本质就是 int 类型 , GetIntArrayElements 函数作用就是将 jintArray 转为 int* 指针 ; 2 ....*env 是 JNI 方法的默认参数 , 这里是 C++ 环境中的 JNIEnv 指针类型 ; jboolean* isCopy 设置成 NULL 参数表示 不关心 jint* 类型变量的生成方式...ReleaseIntArrayElements 方法 jint mode 参数 详解 : ① 模式 0 : 刷新 Java 数组 , 释放 C/C++ 数组 ② 模式 1 ( JNI_COMMIT )...-7411/kim.hsl.jni I/JNI_TAG: 3 . 888 01-12 16:51:56.594 7411-7411/kim.hsl.jni I/JNI_TAG: 4 . 95555 01
转载请以链接形式标明出处: 本文出自:103style的博客 本文操作以 Android Studio 3.4.2 版本为例 NDK开发(一) :NDK入门指南 NDK开发(二) :JNI的数据类型...NDK开发(三) :JNI访问Java变量和方法 NDK开发(四) :JNI操作Java数组 NDK开发(五) :JNI实现文件加解密 NDK开发(六) :JNI实现文件拆分和合并 前先阅读 JNI的数据类型...(array, nullptr); //设置 0-100的随机元素 jint *startP = elementsP; for (; startP GetIntArrayElements(arr_, nullptr); //获取数组长度 jint len = env->GetArrayLength(arr_...//JNI_ABORT:Java数组不进行更新,但是释放C/C++数组 //JNI_COMMIT:Java数组进行更新,不释放C/C++数组(函数执行完后,数组还是会释放的)
JNIEXPORT 在 Window 和 Linux 上有不同的定义: jni.h // Windows 平台 : #define JNIEXPORT __declspec(dllexport) #define...JNICALL 在 Window 和 Linux 上有不同的定义: jni.h // Windows 平台 : #define JNICALL __stdcall // __stdcall 是一种函数调用参数的约定...// Linux 平台: #define JNICALL 2.4 参数 jobject jobject 类型是 JNI 层对于 Java 层应用类型对象的表示。...)(JavaVM*); jint (*GetEnv)(JavaVM*, void**, jint); jint (*AttachCurrentThreadAsDaemon...jni.h struct JNINativeInterface { jint (*MonitorEnter)(JNIEnv*, jobject); jint
.jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android-19.../arch-arm/usr/include/jni.h ; 1....jint (*GetEnv)(JavaVM*, void**, jint); jint (*AttachCurrentThreadAsDaemon)(JavaVM*,..., jint version) { return functions->GetEnv(this, env, version); } jint AttachCurrentThreadAsDaemon...函数指针 数组, 这个数组中存放了大量的 JNI 函数指针, 这些指针指向了具体的 JNI 函数; 4.
; return error; } return JNI_OK; } JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char...; return error; } return JNI_OK; } JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char...; return error; } return JNI_OK; } JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char...; return error; } return JNI_OK; } JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char *...; return error; } return JNI_OK; } JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char
领取专属 10元无门槛券
手把手带您无忧上云