ndk 编译android so,Android studio 编译NDK Android studio 生成.so文件

直接上干货吧

第1步:新建一个Android Studio 工程 TestJNI。新建一个JNITest.java文件,内容如下:

public class JNITest {

static {

System.loadLibrary("JNITest");

}

public static native String getJniTestString();

}

解释一下,先创建一个native的方法,JNITest名字可以随便写,但是最后要和so文件的名字一样。

第2步:生成jni头文件,咱们这里可以配置一下宏命令,方便以后使用

配置宏命令 File-->Setting-->Tools-->External Tools

4c7d9a10933b

配置.jpg

需要添加的我都放下面了,可以直接复制过去

Program: javah

Parameters: -v -jni -d $ModuleFileDir$/src/main/jni $FileClass$

Working directory: $SourcepathEntry$

2.保存之后咱们看下怎么使用刚才配置的命令,在刚才咱们创建好的类上面右键 External Tools --> javah 这个也就是上面咱们配置的名字,如下图:

4c7d9a10933b

使用.jpg

完成之后看下有没有生成成功,你会发现已经在main文件下面多了一个jni的文件夹,里面有一个com_umfintech_testjni_JNITest.h 这个名字是通过咱们报名和类名生成的,如下图:

4c7d9a10933b

完成.jpg

第3步:在jni目录创建.c、.cpp 、.mk文件

1.先创建JNITest.c文件,第一行固定写法,第二行复制刚才生成的.h的文件名,方法还是继续复制.h中的,如下:

#include "jni.h"

#include "com_umfintech_testjni_JNITest.h"

JNIEXPORT jstring JNICALL Java_com_umfintech_testjni_JNITest_getJniTestString

(JNIEnv * env, jclass object){

return (*env)->NewStringUTF(env,"测试 jni");

}

2.生成Android.mk文件,如下图

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#编译生成的文件的类库叫什么名字,就是刚才我前面提到的名字

LOCAL_MODULE := JNITest

#要编译的c文件,上面咱们刚创建的

LOCAL_SRC_FILES := JNITest.c

include $(BUILD_SHARED_LIBRARY)

3.生成Application.mk文件,如下图

APP_ABI := all

第4步:配置NDK

1.在项目的根目录的gradle.properties文件中加上以下代码,表示我们要使用NDK进行开发:

android.useDeprecatedNdk=true

2.在项目local.properties中加入ndk的路径:

ndk.dir=D\:\\android-ndk-r16b // NDK路径

3.在app的build.gradle的defaultConfig中添加如下配置:

ndk {

moduleName "MyJni"

abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的类型

}

sourceSets.main {

jni.srcDirs = ['libs']

}

注意:moudleName这是我们在gradle文件中一样的,必须保持一致才能找到。

第5步:配置ndk-build,生成.so文件

1.配置ndk-build命令

4c7d9a10933b

ndk-build.jpg

Program:D:\android-ndk-r16b\ndk-build.cmd

Working directory: $ModuleFileDir$\src\main\

注意:Program设置自己ndk的路径

2.通过ndk-build命令生成.so文件

在jni目录右键 External Tools --> ndk-build,会在main下面生成相应的.so文件,如下图:

4c7d9a10933b

so.jpg

第6步:java调用.so文件

在main下面创建jniLibs把armeabi文件复制进去,如下图:

4c7d9a10933b

armeabi.jpg

看下activity中怎么调用

public class MainActivity extends AppCompatActivity {

private TextView text;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

text = findViewById(R.id.text);

text.setText(JNITest.getJniTestString());

}

}

4c7d9a10933b

效果.jpg

齐活了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值