-
新建Android项目
-
在local.properties 文件配置ndk路径
ndk.dir=D:\Android\SDK\ndk-bundle
-
File ----> Project Structure ----> SDK Lcation配置Android NDK location。
-
gradle.properties文件配置兼容老的ndk
android.useDeprecatedNdk=true
5. 新建Java JNI 类 MyJni.java,并编写JNI native方法。
package com.csu.ndkdemo;
public class MyJNI {
public native String sayHello();
}
- 生成头文件,cmd进入到工程路径 NdkDemoappsrcmainjava,执行命令生成.h头文件。
javah -classpath . -jni com.csu.ndkdemo.MyJNI
在MyJNI.java文件的同级目录(mainjavacom.csu.ndkdemo)生成一个.h的头文件com_csu_ndkdemo_MyJNI.h。
#include#ifndef _Included_com_csu_ndkdemo_MyJNI #define _Included_com_csu_ndkdemo_MyJNI #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_com_csu_ndkdemo_MyJNI_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
- main下java同级目录新建jni目录,将step6生成的.h文件拷贝到jni目录,然后新建Hello.c文件,实现.h文件中的方法。
#include#include #include JNIEXPORT jstring JNICALL Java_com_csu_ndkdemo_MyJNI_sayHello(JNIEnv *env, jobject thiz) { return (*env)->NewStringUTF(env, "I`m Str from jni libs!"); }
- jni目录下新建Android.mk文件。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Hello LOCAL_SRC_FILES := Hello.c APP_ABI := all include $(BUILD_SHARED_LIBRARY)
- cmd进入到工程路径 NdkDemoappsrcmainjava,执行命令编译生成.so文件。
ndk-build
在jni同级目录下会生成两个文件夹libs和obj。
- 将libs文件夹下的内容拷贝到module项目名下的libs目录。
- module的build.gradle 文件的android{}节点中添加对libs的引用:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
- JNI Java文件MyJni.java中加载.so文件。
package com.csu.ndkdemo;
public class MyJNI {
static {
System.loadLibrary("Hello");
}
public native String sayHello();
}
- Activity中调用JNI方法,并将C中的字符串打印出来。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 调用JNI方法
String rs = new MyJNI().sayHello();
Log.i("MainActivity", "onCreate: " + rs);
}
}



