前言
1 环境 android studio2.3 , window系统
2 ndk https://dl.google.com/android/repository/android-ndk-r16-windows-x86_64.zip
3 采用android.mk编译方式
正文
1 正常新建一个android项目
2 右键项目选择Open Moduls Settings
1)设定好ndk的路径
2)指定开启ndk
3 android新加如下文件
具体代码如下
NdkJniUtils.java
package com.jni.utils; /** * Created by user on 2017/11/22. */ public class NdkJniUtils { static{ System.loadLibrary("hello-jni"); } public static native String stringFromJni(); }
hello-jni.c
#include <string.h> #include <jni.h> jstring Java_com_jni_utils_NdkJniUtils_stringFromJni( JNIEnv* env,jobject thiz ) { return (*env)->NewStringUTF(env, "Hello from JNI !"); }
Android.mk 配置如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Application.mk 配置如下
APP_ABI := armeabi armeabi-v7a x86 mips
注意:其中如果想生成所有平台的so,可以写成
APP_ABI := all
4 配置好build.gradle文件,在Android配置中添加如下配置
sourceSets{ main{ jniLibs.srcDirs "src/main/libs" // 指定so的路径 jni.srcDirs = [] // 禁止gradle自己去自动编译ndk,我们使用的方式是cmd中ndk-build方式 } }
5 写完这些代码后,进入cmd,目录进入到我们的src/main/jni中,执行mk编译
>>ndk-build
编译完后,在src/main/libs目录中会看到我们生成的so文件
6 编写java层代码
activity_main.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical"> <TextView android:id="@+id/edv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <Button android:id="@+id/clickId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="clickBtn"/> </LinearLayout>
MainActivity 类编写代码
package com.koo.ndkdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.jni.utils.NdkJniUtils; public class MainActivity extends AppCompatActivity { TextView ev1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ev1 = (TextView)findViewById(R.id.edv); Button btn=(Button)findViewById(R.id.clickId); btn.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { String res= NdkJniUtils.stringFromJni(); ev1.setText(res); } }); } }
完成后编译运行项目即可