实现Android 与C的交互
1.创建NDK环境搭建
2.配置环境变量
3.创建本地native方法
//创建本地方法,我直接在Activity中创建的
public native String getStringFromC();
这里如果使用系统给的AppCompatActivity,会出现异常找不到类AppCompatActivity,所以为了我继承的是Activity
Activity中完整代码
package com.oblivion.jni_text;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements View.OnClickListener {
static {
System.loadLibrary("jni_text");
}
//javah -d jni -classpath <SDK_android.jar>;<APP_classes> lab.sodino.jnitest.MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}
public native String getStringFromC();
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, getStringFromC(), Toast.LENGTH_SHORT).show();
}
}
- Make一下,如果是project就MakeProject,如果是Module,就Make Module,如下图
4.到这一步需要构建com_oblivion_jni_text_MainActivity.h
实现方法有两个
第一个方式:直接书写,不过挺麻烦的,不推荐也不写了
第二个方式:Alt+F12,进入到Terminal控制台
通过cd指令进入到如下位置cd D:\AndroidStudioProjects\Demo\jni_text\src\main\java
在该位置下输入指令javah -jni com.oblivion.jni_text.MainActivity
//如下完整指令
D:\AndroidStudioProjects\Demo\jni_text\src\main\java>javah -jni com.oblivion.jni_text.MainActivity
5.创建Android.mk文件
#指定编译的文件夹 指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE := JniText
# 编译的源代码的名称
LOCAL_SRC_FILES := JniText.c
#编译一个动态库,静态库
#静态库 文件名.a 包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so 包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)
6.根据创建出来的.h文件创建.c文件
#include "jni.h"
jstring Java_com_oblivion_jni_1text_MainActivity_getStringFromC
(JNIEnv * env, jobject obj){
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
6.重新Make 一下,生成so文件
到这一步就进行完了,运行尝试一下吧,效果图在本章最上方