如果Android studio之前没有进行过NDK相关的配置的话,那么首先就要在Android studio的File->Project Structure窗口下进行NDK的相关下载;如下图没有下载之前
点击Download下载,下载好之后as会自动将ndk加载到项目中,默认情况下ndk下载到了sdk所在的目录下,如下图所示:
下载完成时候也可以通过local.properties文件查看sdk和ndk在电脑上的保存路径,local.properties文件的内容如下:
## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. #Wed Jan 24 15:14:42 CST 2018 ndk.dir=D\:\\develop\\android_studio_sdk\\ndk-bundle sdk.dir=D\:\\develop\\android_studio_sdk第二步:在Java包下新建书写本地方法的Java类,本案例以Hello.java为例,并书写要使用的本地方法callFromC()如下所示:
package com.example.sun.sdkdemo; /** * Created by su on 2018/1/24. */ public class Hello { public static native String callFromC(); }这个时候方法会报错提示说找不到头文件,先不着急处理,让我们接着进行下一步操作,生成本地方法所对应的头文件,在生成头文件之前编译一下我们的module,进行Build->make Module 'app'操作
第三步:cmd进入命令行窗口,在命令行窗口下进入到该工程的main目录下;首先右键单击app,选择show in Explorer打开该工程app所在的盘符路径,接着点击app进入src,再点击src进入到main所在的文件列表,点击main打开main的目录,在上面的路径处复制路径,在dos窗口下输入:cd /d 上述复制的路径,单击回车就进入到的main路径下,接着输入:javah -d jni classpath ..\..\build\intermediates\classes\debug 本地方法类所在的包名.本地方法的类名,然后按回车键就生成了相关的头文件。如下所示
中间报的那两次错误是因为书写本地方法后没有Build,所以在生成头文件之前应该Build一下。
另第三步:在Android studio的termianl窗口下,输入cd app/src/main/java/,然后按回车,再次输入:javah -d ../jni 包名.类名,按回车,这样也可以生成头文件,前提是将你电脑上sdk的platform-tools的路径配置到环境变量中。
第四步:在jni目录下创建hello.c文件,实现头文件中的方法;并创建Android.mk文件,内容如下:
#include "com_example_sun_sdkdemo_Hello.h" JNIEXPORT jstring JNICALL Java_com_example_sun_sdkdemo_Hello_callFromC (JNIEnv * env, jclass jclas){ return (*env)->NewStringUTF(env,"from c"); }
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c # for logging LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)Android.mk文件中的LOCAL_MODULE :=hello指定的是生成动态库的名字,LOCAL_SRC_FILES :=hello.c关联的是jni目录下的.c文件。
第五步:编译配置,在module/build.gradle中添加如下内容
点击配置文件上面出现的sync
第六步:在Hello.java中加载动态库如下:
package com.example.sun.sdkdemo; /** * Created by su on 2018/1/24. */ public class Hello { static { System.loadLibrary("hello"); } public static native String callFromC(); }
第七步:在MainActivity中的Button点击事件中调用本地方法
package com.example.sun.sdkdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.btu_call_from_c); mButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { mButton.setText(Hello.callFromC()); } }); } }这样就完成了一般的NDK使用流程