1.配置JNI环境
下载ndk版本
配置环境变量–>将ndk-build.cmd文件所在路径配置到path中
2.创建一个android工程
2.1 在MainActivity中创建一个本地方法
package com.example.jni;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener{
private Button btn;
//这个静态代码块“hello”对应的是Android.mk中的 LOCAL_MODULE := hello
static{
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String str = helloFromC();
Toast.makeText(this, str, Toast.LENGTH_LONG).show();
}
//声明一个本地方法,让java调用c方法
public native String helloFromC();
}
2.2在工程中创建一个文件夹-名字为jni
2.3在jni文件夹中创建一个hello.c文件
如下图所示:
3.在hello.c写如下代码
jni.h–表示ndk中的头文件
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
/**
*
* 实现在MainActivity中 声明的本地方法
*
* 方法命名规范:
* 1.Java_(包名)_(类名)_(方法名)
* 2.根据jni规范要求,必须传入2个参数JNIEnv* env,jobject obj
*
* 在jni-h的文件中找到JNIEnv JNIEnv 的类型:JNINativeInterface
* struct JNINativeInterface* JNIEnv JNINativeInterface为结构体
*
* eg:二级指针概念
* int i =10;
* int* p = &i;
* int** q = &p;
* 那么 取出i的值:**q就取出的值了
*
* eg:
* 调用这个方法 (*GetVersion)(JNIEnv *);
*
* 第一种调用的方法:(**Env).GetVersion(env);
*
* 第二种调用的方法:(*Env)->GetVersion(env);
*
*
* 我们需要的是返回jstring的方法,在jni-h文件中找到如下方法
*
* jstring jstring (*NewStringUTF)(JNIEnv*, const char*);
*/
jstring Java_com_example_jni_MainActivity_helloFromC(JNIEnv* env , jobject obj){
// (*NewStringUTF)(JNIEnv*, const char*);
return (*env)->NewStringUTF(env,"hello java");
}
4 C代码写好之后,我们需要在jni目录创建一个Android.mk的文件
内容为:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello //表示库文件,名字与java代码中的静态代码块名字相同
LOCAL_SRC_FILES := hello.c //表示c文件,文件名必须相同
include $(BUILD_SHARED_LIBRARY)
5.编译后会在libs文件夹中生成一个.so的文件(需要刷新工程)
编辑的指令
6.在MainActivity文件中需要添加一个静态代码块
static{
System.loadLibrary("hello");
}
运行工程,点击button,会弹出tosat.
总结开发步骤
[1]定义一个本地方法 需要C去实现
public native String helloFromC();
[2]在Android工程下创建一个jni目录 创建一个folder
[3]在jni目录下创建C文件 实现我们在mainActivity中声明的本地方法
[4]定义实现的方法 Java_(包名)(类名)(方法名) 必须要接收2个参数JNIEnv* env jobject obj
[5]查看jni.h的头文件 找到函数指针 实现方法
[6]只要C代码写好了 就是要ndk-build去编译一下
[7]需要一个Android.mk文件 在ndk的docs下
[8]编译之后 会在libs下生成一个so库文件
[9]最后一步 一定要记得加载动态库文件