Android studio 编译NDK Android stu
<meta charset="utf-8">
直接上干货吧
第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
需要添加的我都放下面了,可以直接复制过去
Program: javah
Parameters: -v -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $SourcepathEntry$
2.保存之后咱们看下怎么使用刚才配置的命令,在刚才咱们创建好的类上面右键 External Tools
--> javah
这个也就是上面咱们配置的名字,如下图:
完成之后看下有没有生成成功,你会发现已经在main文件下面多了一个jni的文件夹,里面有一个com_umfintech_testjni_JNITest.h
这个名字是通过咱们报名和类名生成的,如下图:
第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
命令
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
文件,如下图:
第6步:java
调用.so
文件
在main
下面创建jniLibs
把armeabi
文件复制进去,如下图:
看下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());
}
}
作者:越努力越幸运阳
链接:https://www.jianshu.com/p/4c7d9a10933b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。