实现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函数)相关推荐

  1. android JNI层线程回调Java函数

    今天,简单讲讲android的jni如何使用jni回调java函数. 之前,我写了部分jni的博客,讲的都是如何从android的java代码调用jni的函数.最近,需要做一个新的功能,在jni的C函 ...

  2. android jni 回调 java_android linux线程通过JNI回调java函数 | 学步园

    Linux线程通过JNI回调JAVA函数 最近做的一个小工程需要用到回调函数,由linux层回调到java层,调试的时候会遇到一些问题,免得忘记,在这里记录一下: JNI的各种数据类型和数据结构我就不 ...

  3. Android JNI_OnLoad()函数

    JVM加载完本地库会调用JNI_OnLoad()函数 当Android的 VM(VirtualMachine)执行到C组件(即*so文件)里的System.loadLibrary()函数时,首先会去执 ...

  4. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  5. android 函数名注册,Android JNI 函数注册的两种方式(静态注册/动态注册)

    在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相关方法之前, 要 ...

  6. android的动态注册,Android JNI 函数注册的两种方式(静态注册/动态注册)

    JNI/NDK 在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相 ...

  7. android java调用参数,如何从命令行调用Android JNI函数并传递Java对象参数

    一.前言 当我们对某个使用原生库(native library)的恶意软件或者应用进行分析或渗透测试时,如果能够对库函数进行隔离和执行是再好不过的事情,这样做我们就可以使用其自身的代码来调试对抗恶意软 ...

  8. android jni (jni_onload方式)

    一.简述 JNI(Java Native Interface)Java本地接口,是为方便java调用C或者C++等本地代码所封装的一层接口.由于Java的跨平台性导致本地交互能力不好,一些和操作系统相 ...

  9. [转]Android JNI使用方法

    本文转自:http://www.open-open.com/lib/view/open1324909652374.html 经过几天的努力终于搞定了android JNI部分,下面将我的这个小程序和大 ...

最新文章

  1. vue数组中数据变化但是视图没有更新解决方案
  2. android camera2获取摄像头支持的分辨率
  3. FileUpload控件实现单按钮图片自动上传并带预览显示
  4. boost::geometry::detail::overlay::get_relative_order用法的测试程序
  5. the value of esp was not properly saved
  6. 成为自信的node.js开发者(一)
  7. 数学也浪漫 数学的几句贴心话
  8. 最好的计划是略有闲余的计划,用于缓冲必然出现的错误与突发事件(转)
  9. 4月7日发!荣耀Play6T Pro开启预约:后置相机模组感人
  10. idea系---懒人
  11. windows 7 删除保留分区
  12. echarts(雷达图和中国地图)
  13. WP8.1开发:简单的天气预报应用
  14. java 判断两个字符串相等
  15. mysql统计分数段人数_mysql 按分数段,每个专业分数段统计人数
  16. Springboot+vue项目实验室管理系统
  17. oracle 导入导出dum文件
  18. IconPackager 3.1 Enhanced - subpackages support
  19. PERT图(工程网络图)
  20. Android:视图绘制(六) ------Paint进阶之ColorMatrix(一)

热门文章

  1. Git使用教程:超详细、超傻瓜、超浅显、真正手把手教
  2. Linux中的sed命令,使用方法之一「替换字符串中的内容 」,以及「s/ / / 」和「s/ / /g」之间的区别
  3. ping命令的作用。
  4. 解决bootstrap dropdown 下拉菜单有时候不能显示的问题
  5. c#解决浏览器跨域问题
  6. Linux oracle中文乱码的问题解决
  7. js做四则运算时,精度丢失问题及解决方法
  8. 杂谈异常处理try-catch-finally
  9. #研发解决方案介绍#Tracing(鹰眼)
  10. rosweb,roslib,ROS2D.PolygonMarker 绘制多边形