在android-4.0.4版本中添加:
—————————————
vim frameworks/base/core/java/android/util/Javahello.java
============================================================================
Javahello.java如下:
package android.util;
public final class Javahello{
static {
System.loadLibrary("javahello"); //这个javahello是JNI层需要实现的动态库 makefile里的LOCAL_MODULE=libjavahello
}
/** @hide */ public static native String native_hello();
/** @hide */ public static native int native_add(int x,int y);
}
============================================================================
javac Javahello.java 编译出Javahello.class,没有什么用这个文件。
javah Javahello 编译出Javahello.h JNI的接口函数声明在里面, 一会在JNI层实现接口函数 native_hell()和native_add()。Javahello.h是编译出来的,不需要修改。
============================================================================
Javahello.h如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Javahello */
#ifndef _Included_Javahello
#define _Included_Javahello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Javahello
* Method: native_hello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Javahello_native_1hello
(JNIEnv *, jclass);
/*
* Class: Javahello
* Method: native_add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Javahello_native_1add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
============================================================================
mkdir frameworks/base/native_hello/ 创建自己JNI层的源码目录
[jiajiandong@jiajiandong android-4.0.4]$ cd frameworks/base/native_hello/
[jiajiandong@jiajiandong native_hello]$ ls
Android.mk include src
[jiajiandong@jiajiandong native_hello]$ tree .
.
|-- Android.mk
|-- include
| `-- Javahello.h
`-- src
`-- jni
`-- native_hello.c
============================================================================
Android.mk如下:
LOCAL_PATH := $(call my-dir) 获取当前路径
include $(CLEAR_VARS) 清除变量值
LOCAL_MODULE_TAGS := eng 关于编译的等级
LOCAL_SRC_FILES := \ 源码文件
src/jni/native_hello.c
LOCAL_C_INCLUDES := \ C语言头文件位置
$(LOCAL_PATH)/include \
$(JNI_H_INCLUDE) \
LOCAL_MODULE := libjavahello 模块名
include $(BUILD_SHARED_LIBRARY) 编译成什么 这个是shared_library,动态链接库
============================================================================
native_hello.c如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <jni.h>
#include <assert.h>
/*
* * Class: Javahello
* * Method: native_hello
* * Signature: ()Ljava/lang/String;
* */
JNIEXPORT jstring JNICALL Java_Javahello_native_1hello(JNIEnv *env, jclass clazz){
printf("hello in c native code.\n");
return (*env)->NewStringUTF(env,"hello world returned."); //返回一个字符串
}
/*
* * Class: Javahello
* * Method: native_add
* * Signature: (II)I
* */
JNIEXPORT jint JNICALL Java_Javahello_native_1add(JNIEnv *env, jclass clazz, jint x, jint y){
return x+y;
}
static JNINativeMethod gMethods[] = { //gMethods里的函数会被注册到env的一个泛型队列内
{"native_hello","()Ljava/lang/String;",(void*)Java_Javahello_native_1hello},
{"native_add","(II)I",(void*)Java_Javahello_native_1add}, //注册 (II)I可以在头文件找到
};
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, "android/util/Javahello", //这里注册gMethods
gMethods, sizeof(gMethods) / sizeof(gMethods[0])))
return JNI_FALSE;
return JNI_TRUE;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
printf("Entering JNI_OnLoad\n");
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK)
goto bail;
assert(env != NULL);
if (!registerNatives(env))
goto bail;
/* success -- return valid version number */
result = JNI_VERSION_1_4;
bail:
printf("Leaving JNI_OnLoad (result=0x%x)\n", result);
return result;
}
============================================================================
然后编译。
之后就可以像使用普通的java类一样的使用Javahello类,
—————————————
vim frameworks/base/core/java/android/util/Javahello.java
============================================================================
Javahello.java如下:
package android.util;
public final class Javahello{
static {
System.loadLibrary("javahello"); //这个javahello是JNI层需要实现的动态库 makefile里的LOCAL_MODULE=libjavahello
}
/** @hide */ public static native String native_hello();
/** @hide */ public static native int native_add(int x,int y);
}
============================================================================
javac Javahello.java 编译出Javahello.class,没有什么用这个文件。
javah Javahello 编译出Javahello.h JNI的接口函数声明在里面, 一会在JNI层实现接口函数 native_hell()和native_add()。Javahello.h是编译出来的,不需要修改。
============================================================================
Javahello.h如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Javahello */
#ifndef _Included_Javahello
#define _Included_Javahello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Javahello
* Method: native_hello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Javahello_native_1hello
(JNIEnv *, jclass);
/*
* Class: Javahello
* Method: native_add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Javahello_native_1add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
============================================================================
mkdir frameworks/base/native_hello/ 创建自己JNI层的源码目录
[jiajiandong@jiajiandong android-4.0.4]$ cd frameworks/base/native_hello/
[jiajiandong@jiajiandong native_hello]$ ls
Android.mk include src
[jiajiandong@jiajiandong native_hello]$ tree .
.
|-- Android.mk
|-- include
| `-- Javahello.h
`-- src
`-- jni
`-- native_hello.c
============================================================================
Android.mk如下:
LOCAL_PATH := $(call my-dir) 获取当前路径
include $(CLEAR_VARS) 清除变量值
LOCAL_MODULE_TAGS := eng 关于编译的等级
LOCAL_SRC_FILES := \ 源码文件
src/jni/native_hello.c
LOCAL_C_INCLUDES := \ C语言头文件位置
$(LOCAL_PATH)/include \
$(JNI_H_INCLUDE) \
LOCAL_MODULE := libjavahello 模块名
include $(BUILD_SHARED_LIBRARY) 编译成什么 这个是shared_library,动态链接库
============================================================================
native_hello.c如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <jni.h>
#include <assert.h>
/*
* * Class: Javahello
* * Method: native_hello
* * Signature: ()Ljava/lang/String;
* */
JNIEXPORT jstring JNICALL Java_Javahello_native_1hello(JNIEnv *env, jclass clazz){
printf("hello in c native code.\n");
return (*env)->NewStringUTF(env,"hello world returned."); //返回一个字符串
}
/*
* * Class: Javahello
* * Method: native_add
* * Signature: (II)I
* */
JNIEXPORT jint JNICALL Java_Javahello_native_1add(JNIEnv *env, jclass clazz, jint x, jint y){
return x+y;
}
static JNINativeMethod gMethods[] = { //gMethods里的函数会被注册到env的一个泛型队列内
{"native_hello","()Ljava/lang/String;",(void*)Java_Javahello_native_1hello},
{"native_add","(II)I",(void*)Java_Javahello_native_1add}, //注册 (II)I可以在头文件找到
};
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, "android/util/Javahello", //这里注册gMethods
gMethods, sizeof(gMethods) / sizeof(gMethods[0])))
return JNI_FALSE;
return JNI_TRUE;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
printf("Entering JNI_OnLoad\n");
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK)
goto bail;
assert(env != NULL);
if (!registerNatives(env))
goto bail;
/* success -- return valid version number */
result = JNI_VERSION_1_4;
bail:
printf("Leaving JNI_OnLoad (result=0x%x)\n", result);
return result;
}
============================================================================
然后编译。
之后就可以像使用普通的java类一样的使用Javahello类,