Android JNI(实现自己的JNI_OnLoad函数)

2010年09月03日 18:25:00

实现JNI中本地函数注册可以两种方式:
(1)采用默认的本地函数注册流程。
(2)自己重写JNI_OnLoad()函数。(本文介绍)(Android中采用这种)

Java端代码:

package com.jni;
public class JavaHello {
	public static native String hello();
	static {
		// load library: libtest.so
		try {
			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_OnLoad简介与应用

一、JNI_OnLoad简介  Java JNI有两种方法,一种是通过javah,获取一组带签名函数,然后实现这些函数。 这种方法很常用,也是官方推荐的方法。 还有一种就是JNI_OnLoad方...
  • fireroll
  • fireroll
  • 2015年11月29日 23:11
  • 2397

JNI_Onload的使用

JNI_Onload在执行system.loadLibrary()函数时被调用,主要用途: 1.通过JNI_Onload告知VM,当前so库使用的JNI版本,最老的版本问JNI 1.1(JNI_On...
  • saicheng
  • saicheng
  • 2013年05月04日 10:23
  • 1839

Java JNI_OnLoad的妙用

原文链接:http://liview.cn/discuz/forum.php?mod=viewthread&tid=5 Java JNI有两种方法,一种是通过javah,获取一组带签名函数,...
  • imyfriend
  • imyfriend
  • 2013年06月18日 10:14
  • 17668

Android JNI 动态注册方法(JNI_OnLoad)

传统的关于android使用JNI调用C/C++程序,首先javah 生产头文件,然后拷贝头文件里面的方法到C文件中进行映射调用,由于这种方法生成的映射方法名不太规则也比较长,二呢是调用数据较慢;因此...
  • leifengpeng
  • leifengpeng
  • 2016年09月06日 10:44
  • 2862

Android Jni中JNI_OnLoad的地位和使用

在jni中,或者android系统源代码中,最常用到的是通过JNI_OnLoad(...)方法,对方法进行注册,而不会像前面的测试demo,生成.h头文件,然后写一个.c的去实现.h中的方法,JNI_...
  • qq_31726827
  • qq_31726827
  • 2015年12月28日 10:25
  • 2946

Android System.loadLibrary及JNI_OnLoad简介

1. Android系统加载JNI Lib的方法    Android系统加载JNI Lib的方法有如下两种:   1) 通过JNI_OnLoad   2) 如果JNI Lib没有定义JNI_OnLo...
  • MyArrow
  • MyArrow
  • 2013年08月02日 16:42
  • 15013

Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods

Android JNI和NDK关系  1、什么JNI Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地...
  • u011270282
  • u011270282
  • 2016年01月18日 21:27
  • 989

JNI_OnLoad returned bad version (-1) 问题解决 proguard

添加jni时出现如下问题 log 如下 01-07 17:34:51.406 W/dalvikvm( 2032): JNI_OnLoad returned bad version (-1) i...
  • hlglinglong
  • hlglinglong
  • 2014年01月07日 19:31
  • 5571

JNI java.lang.UnsatisfiedLinkError

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.mingspy.jseg.JSegJNI.MaxSplit(Ljava/l...
  • mingspy
  • mingspy
  • 2014年04月09日 14:04
  • 11493

[bug小记]System.loadLibrary加载so库时报警告JNI_OnLoad returned bad version(-1)并且crash

public class SVideoEngineController{ static{ System.loadLibrary("arcplatform"); System.loadLi...
  • shirleyxiao
  • shirleyxiao
  • 2014年08月05日 16:53
  • 7835
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android JNI(实现自己的JNI_OnLoad函数)
举报原因:
原因补充:

(最多只允许输入30个字)