JNI的知识就不再赘述了,网上很多,直接上例子。
1.启动AS,新建工程JniTest。新建JniTest类:
package com.mega.jnitest;
public class JniTest {
public static native String getTestString();
static {
System.loadLibrary("JniTest");
}
}
2.生成.h文件。cmd打开终端,打开JniTest.java文件所在路径:
得到对应的JniTest.class文件。返回上一级执行javah命令,即得到.h文件:
com_mega_jnitest_JniTest.h的内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_mega_jnitest_JniTest */
#ifndef _Included_com_mega_jnitest_JniTest
#define _Included_com_mega_jnitest_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_mega_jnitest_JniTest
* Method: getTestString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_mega_jnitest_JniTest_getTestString
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3.新建一个jni文件夹,在该文件夹中新建一个main.c,将上一步生成的.h文件全部内容复制到该.c文件中,并实现里面的函数:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_mega_jnitest_JniTest */
#ifndef _Included_com_mega_jnitest_JniTest
#define _Included_com_mega_jnitest_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_mega_jnitest_JniTest
* Method: getTestString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_mega_jnitest_JniTest_getTestString
(JNIEnv *env, jclass jobject){
//返回一句话
return (*env)->NewStringUTF(env,"this is jni test!");
}
#ifdef __cplusplus
}
#endif
#endif
4.配置NDK环境。
打开AS的Settings,检查NDK、CMake、LLDB是否安装:
安装完成后,配置NDK系统环境变量,找到NDK安装路径(File-->Project Structure):
将该路径复制,配置系统变量:
配置完成后,打开cmd,执行ndk-build命令:
出现执行命令后这样的提示已表示配置成功了!
5.Jni目录下创建Android.mk、Application.mk文件。
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES =: main.c
include $(BUILD_SHARED_LIBRARY)
Application.mk:
APP_MODULES := JniTest
APP_ABI := all
6.在app下的build.gradle的defaultConfig中加入如下配置:
ndk{
moduleName "JniTest"
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
}
7.配置工程下的gradle.properties文件:
8.终端跳转到项目的main目录下执行ndk-build命令:
生成各种so文件:
9.主程序调用native方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
tv.setText(JniTest.getTestString());
}
运行后ok!