简单记录下Android NDK混合使用java和C/C++的过程,
其实很简单,
需要以下几个步骤:
1.在java代码中声明本地方法
2.实现Java本地接口(JNI)粘合层
3.创建Android Makefile文件
4.用C/C++实现本地方法
5.编译本地库
6.加载本地库
Step1:在java代码中声明本地方法
首先创建一个普通的android工程:
public native String getHelloString(); //声明
public native String get_Hello_String();//声明
声明2个方法,一个名称是不带下划线的,一个名称带下划线的
//native方法就是告诉虚拟机,这个方法由本地的代码实现
Step 2:在项目根目录下创建一个jni目录:
注意:先将源码包copy到android-ndk-rX/samples下面,直接在workspace里面执行javah会报错无法访问android.app.Activity
到src目录下面
javah -jni com.example.hellojni.MainActivity
生成 com_example_hellojni_MainActivity.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_hellojni_MainActivity */
#ifndef _Included_com_example_hellojni_MainActivity
#define _Included_com_example_hellojni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_hellojni_MainActivity
* Method: getHelloString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_getHelloString
(JNIEnv *, jobject);
/*
* Class: com_example_hellojni_MainActivity
* Method: get_Hello_String
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_get_1Hello_1String
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Step3:创建Android Makefile文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
Step 4:用C/C++实现本地方法
#include <stdio.h>
#include <jni.h>
jstring Java_com_example_hellojni_MainActivity_getHelloString(JNIEnv* env,jobject obj){
return (*(*env)).NewStringUTF(env,"1.hello world!");
}
jstring Java_com_example_hellojni_MainActivity_get_1Hello_1String(JNIEnv* env,jobject obj){
return (*env)->NewStringUTF(env,"2.__hello___!");
}
Step 5:编译本地库
$NDK/ndk-build
Step 6:加载本地库
static{
System.loadLibrary("Hello");//加载动态链接库(把二进制库文件加载到java虚拟机里)
}
附上Demo源码,供大家参考:http://download.csdn.net/detail/cicilover/7797905