开始之前先进行环境配置
1.下载NDK
2.配置环境变量,在path中添加NDK的路径
本文以helloFromC方法为例
1. 在项目根目录下创建jni文件夹
2. 在jni文件中创建一个c文件
3. 在java代码中,创建一个本地方法helloFromC
public native String helloFromC();
4. 在jni中定义函数实现这个方法,函数名必须为 :包名+类名+方法名,对于无参的添加默认的两个参数,对于需要传人参数的,写上前连个默认的,直接添加传人的参数
jstring Java_com_excmple_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)
5. 返回一个字符串,用c定义一个字符串
char* cstr = "hello from c";
6. 把c的字符串转换成java的字符串
jstring jstr = (*env)->NewStringUTF(env, cstr);
return jstr;
7. 在jni中创建Android.mk文件,与.c文件同级别
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#编译生成的文件的类库叫什么名字
LOCAL_MODULE := hello
#要编译的c文件
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
8. 在c文件中添加<jni.h>头文件
9. 在jni文件夹下执行ndk-build.cmd指令,默认只生成arm的lib为了支持所有平台需要在jni文件夹中创建Application.mk
内容:APP_ABI := armeabi armeabi-v7a x86
10. java代码中加载so类库,调用本地方法static{
//加载打包完毕的so类库
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Toast.makeText(this, helloFromC(), 0).show();
}
//定义一个本地方法,方法体由c语言实现
public native String helloFromC();
注:可以使用javah命令自动生成方法名,根据java版本不同,方式不同
*1.7:在src目录下执行javah 包名.类名
*1.6:在bin/classes目录下执行