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(); }