Android JNI(实现自己的JNI_OnLoad函数)
实现JNI中本地函数注册可以两种方式:
(1)采用默认的本地函数注册流程。
(2)自己重写JNI_OnLoad()函数。(本文介绍)(Android中采用这种)
Java端代码:
package com.jni; public class JavaHello {public static native String hello();static {// load library: libtest.sotry {System.loadLibrary("test");} catch (UnsatisfiedLinkError ule) {System.err.println("WARNING: Could not load library!");}}public static void main(String[] args) {String s = new JavaHello().hello();System.out.println(s);} }
本地C语言代码:
#include <stdlib.h> #include <string.h> #include <stdio.h> #include <jni.h> #include <assert.h>JNIEXPORT jstring JNICALL native_hello(JNIEnv *env, jclass clazz) {printf("hello in c native code./n");return (*env)->NewStringUTF(env, "hello world returned."); }#define JNIREG_CLASS "com/jni/JavaHello"//指定要注册的类/** * Table of methods associated with a single class. */ static JNINativeMethod gMethods[] = {{ "hello", "()Ljava/lang/String;", (void*)native_hello },//绑定 };/* * Register several native methods for one class. */ static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* gMethods, int numMethods) {jclass clazz;clazz = (*env)->FindClass(env, className);if (clazz == NULL) {return JNI_FALSE;}if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {return JNI_FALSE;}return JNI_TRUE; }/* * Register native methods for all classes we know about. */ static int registerNatives(JNIEnv* env) {if (!registerNativeMethods(env, JNIREG_CLASS, gMethods, sizeof(gMethods) / sizeof(gMethods[0])))return JNI_FALSE;return JNI_TRUE; }/* * Set some test stuff up. * * Returns the JNI version on success, -1 on failure. */ 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) != JNI_OK) {return -1;}assert(env != NULL);if (!registerNatives(env)) {//注册 return -1;}/* success -- return valid version number */result = JNI_VERSION_1_4;return result; }
编译及运行流程:
1 设置三个环境变量:
export JAVA_HOME:=/usr/lib/jvm/java-6-sun-1.6.0.15
export JAVA_SRC_PATH:=/home/kortide/Jackey/jni/jni_onload/com/jfo
export NATIVE_SRC_PATH:=/home/kortide/Jackey/jni/jni_onload/jni
2 编译JavaHello.java:
javac $JAVA_SRC_PATH/JavaHello.java
3. 编译NativeHello.c,生成共享库
gcc -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -c -o $NATIVE_SRC_PATH/NativeHello.o $NATIVE_SRC_PATH/NativeHello.c
gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o $NATIVE_SRC_PATH/libtest.so $NATIVE_SRC_PATH/NativeHello.o
4. 运行
java com/jni/JavaHello
Android JNI(实现自己的JNI_OnLoad函数)相关推荐
- android JNI层线程回调Java函数
今天,简单讲讲android的jni如何使用jni回调java函数. 之前,我写了部分jni的博客,讲的都是如何从android的java代码调用jni的函数.最近,需要做一个新的功能,在jni的C函 ...
- android jni 回调 java_android linux线程通过JNI回调java函数 | 学步园
Linux线程通过JNI回调JAVA函数 最近做的一个小工程需要用到回调函数,由linux层回调到java层,调试的时候会遇到一些问题,免得忘记,在这里记录一下: JNI的各种数据类型和数据结构我就不 ...
- Android JNI_OnLoad()函数
JVM加载完本地库会调用JNI_OnLoad()函数 当Android的 VM(VirtualMachine)执行到C组件(即*so文件)里的System.loadLibrary()函数时,首先会去执 ...
- 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】
Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...
- android 函数名注册,Android JNI 函数注册的两种方式(静态注册/动态注册)
在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相关方法之前, 要 ...
- android的动态注册,Android JNI 函数注册的两种方式(静态注册/动态注册)
JNI/NDK 在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相 ...
- android java调用参数,如何从命令行调用Android JNI函数并传递Java对象参数
一.前言 当我们对某个使用原生库(native library)的恶意软件或者应用进行分析或渗透测试时,如果能够对库函数进行隔离和执行是再好不过的事情,这样做我们就可以使用其自身的代码来调试对抗恶意软 ...
- android jni (jni_onload方式)
一.简述 JNI(Java Native Interface)Java本地接口,是为方便java调用C或者C++等本地代码所封装的一层接口.由于Java的跨平台性导致本地交互能力不好,一些和操作系统相 ...
- [转]Android JNI使用方法
本文转自:http://www.open-open.com/lib/view/open1324909652374.html 经过几天的努力终于搞定了android JNI部分,下面将我的这个小程序和大 ...
最新文章
- vue数组中数据变化但是视图没有更新解决方案
- android camera2获取摄像头支持的分辨率
- FileUpload控件实现单按钮图片自动上传并带预览显示
- boost::geometry::detail::overlay::get_relative_order用法的测试程序
- the value of esp was not properly saved
- 成为自信的node.js开发者(一)
- 数学也浪漫 数学的几句贴心话
- 最好的计划是略有闲余的计划,用于缓冲必然出现的错误与突发事件(转)
- 4月7日发!荣耀Play6T Pro开启预约:后置相机模组感人
- idea系---懒人
- windows 7 删除保留分区
- echarts(雷达图和中国地图)
- WP8.1开发:简单的天气预报应用
- java 判断两个字符串相等
- mysql统计分数段人数_mysql 按分数段,每个专业分数段统计人数
- Springboot+vue项目实验室管理系统
- oracle 导入导出dum文件
- IconPackager 3.1 Enhanced - subpackages support
- PERT图(工程网络图)
- Android:视图绘制(六) ------Paint进阶之ColorMatrix(一)
热门文章
- Git使用教程:超详细、超傻瓜、超浅显、真正手把手教
- Linux中的sed命令,使用方法之一「替换字符串中的内容 」,以及「s/ / / 」和「s/ / /g」之间的区别
- ping命令的作用。
- 解决bootstrap dropdown 下拉菜单有时候不能显示的问题
- c#解决浏览器跨域问题
- Linux oracle中文乱码的问题解决
- js做四则运算时,精度丢失问题及解决方法
- 杂谈异常处理try-catch-finally
- #研发解决方案介绍#Tracing(鹰眼)
- rosweb,roslib,ROS2D.PolygonMarker 绘制多边形