记录下ndk如何编译.so文件 循序渐进的说下: 首先下载NDK,这个我是直接在Android studio里面下载的,也没去官网下载,下载好了,就是配置环境变量了,由于我是从Android studio里面下载的,因此就直接在path中配置D:android_sdk/ndk-bundle这个路径了,配好了后咱们能够用ndk-build去cmd命令台检测下看下是否配置成功 接下来就是在Android studio中配置了,须要在sdklocation中配置下,还有local.properties以及gradle.properties中去配置,具体配置网上一大堆,这里没有难点 首先咱们想要打出一个.so文件来,咱们确定是要先写Java代码java
第一步: 解释一下这里代码的意思: native这个就是咱们提供出去的方法,这个方法到时候要和.c文件里面或者.cc文件里面的方法名一致,咱们再静态中去加载咱们打出来的.so文件, 这里的参数名字不是.so文件的名字,而是咱们在打包的时候配置的名字,这个配置下面介绍android
public class JniKit {
//这里的方法名若是报错那是正常的,不影响
public static native int calculate(int num);
static {
System.loadLibrary("JniDemo");
}
}
复制代码
第二步: 咱们须要根据这个写好的Java文件来生成一个.h文件,生成.h文件是经过javah来执行的,这里我以前尝试了各类办法,可是网上说的办法都没办法成功,都是报错说找不到类文件,我以为这里可能和个人文件的方法有点问题,等会我把我如今成功的文件目录贴出来,执行的代码bash
javah -classpath D:\360PhoneInfo\small-video-record-master\SmallVideoRecord2\testndk\build\intermediates\classes\debug -d jni
com.example.testndk.JniKit
复制代码
根据这个代码我获得了.h文件,包括这个jni文件夹也是经过-d jni这个生成出来的,不是本身建立的 app
第三步: 如今咱们有了.h文件了,接下来就是写.c文件了,固然了我不会c语言,因此这里拿了一个测试的来用,c这部分的不用关注太多 include中指向你建立的.h头文件 Java_com_example_testndk_JniKit_calculate;Java_包名_类名_方法名(参数)ide
#include "com_example_testndk_JniKit.h"
JNIEXPORT jint JNICALL Java_com_example_testndk_JniKit_calculate(JNIEnv *env, jclass cls, jint num) {
return num * num;
}
复制代码
第四步: 如今.h.c文件咱们都有了,接下来就是最关键的一步了,生成.so文件了,这一步,我查阅了不少资料,折磨了两个小时,才弄出来,这里我不知道是否是个人配置有问题,仍是什么问题,反正我在build.gradle配置,而后去Make Project生成了好久没有生成出来,这里我是用命令行中的ndk-build来解决的测试
解决方式以下:
1.创建一个Android.mk文件 LOCAL_MODULE表示模块名称 LOCAL_SRC_FILES表示须要参与编译的源文件,就是咱们的c 除了这两个,其余照搬便可gradle
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := jni_test.c
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog
include $(BUILD_SHARED_LIBRARY)
复制代码
2.创建一个Application.mk文件 须要注意的东西都写在里面了,以逗号分割cpu指令ui
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a #这句是设置生成的cpu指令类型,提示,目前绝大部分安卓手机支持armeabi,libs下太多类型,编译进去 apk 包会过大
APP_PLATFORM := android-8 #这句是设置最低安卓平台,能够不弄
复制代码
3.由于个人这两个文件是和.h.c放在同一个文件夹中-jni,因此咱们要执行ndk-build命令须要进入到jni文件夹下再去执行,好比说D:\360PhoneInfo\small-video-record-master\SmallVideoRecord2\testndk\src\main\jni>ndk-build 如此执行完后就会在 main目录下生成一个libs文件夹,里面有咱们配置好的.so文件 ,以下: spa
sourceSets {//在Android的根目录下配置
main {
//你的源码目录
jniLibs.srcDirs 'src/main/libs'
}
}
复制代码
接下来我把我成功调用了的方法贴出来命令行
package com.example.test;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.example.testndk.JniKit;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView viewById = (TextView) findViewById(R.id.tv);
findViewById (R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
int i=JniKit.calculate(4);
Log.w("aaa", "---"+i);
viewById.setText(i+"");
} catch (Exception e) {
Log.w("aaa", "---"+e.toString());
}
}
});
}
}
复制代码