前言
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);
}
});
}
}
完成后编译运行项目即可
来源:oschina
链接:https://my.oschina.net/u/4408894/blog/4215601