01 android ndk入门实例之android.mk编译

馋奶兔 提交于 2020-04-28 22:15:49

 前言

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);
            }
        });
    }
}

完成后编译运行项目即可

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!