1.在java类中定义native方法相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的
public native String helloWorldFromC();
2.使用javah命令,在class目录下生成头文件
#include <jni.h>
/* Header for class com_example_helloworldformc_MainActivity */
#ifndef _Included_com_example_helloworldformc_MainActivity
#define _Included_com_example_helloworldformc_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_helloworldformc_MainActivity
* Method: helloWorldFromC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_helloworldformc_MainActivity_helloWorldFromC
(JNIEnv *, jobject);
3.根据头文件,实现C代码
#include <stdio.h>
#include "com_example_helloworldformc_MainActivity.h"; // 引入ndk环境里面的头文件 需要用<> 引用代码中的头文件 ""
//public native String helloWorldFromC(){}
jstring Java_com_example_helloworldformc_MainActivity_helloWorldFromC(JNIEnv* env,jobject obj){
// 2 步 实现C代码
// 返回一个java String 类型的字符串
//jstring (*NewStringUTF)(JNIEnv*, const char*);
//(*env) 相当于 JNINativeInterface* JNIEnv
//*(*env) 相当于 JNINativeInterface
///return (**env).NewStringUTF(env,"helloworldfromc");
return (*env)->NewStringUTF(env,"helloworldfromc");
// andrond.mk 告诉编译器 如何把c代码打包成函数库
// 3 生成 .mk文件
// 4步 把c代码 打包成函数库
}
4.根据实现C代码需要的函数库,生成Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 对应打包成函数库的名字
LOCAL_MODULE := hello
# 对应c代码的文件
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
5.使用NDK编译
6.在java代码中引入函数库,调用native方法
static{
System.loadLibrary("hello");// 注意事项 去掉前面的lib 后面的.so
}
public void click(View view){
// 弹出一个土司 土司的内容 是c代码写出来
// 第6步
Toast.makeText(getApplicationContext(), hello_world_from_c(), 0).show();
}