最近玩了下JNI,今天就来记录下来JNI的一些步骤
以前在Eclipse上面玩JNI配置是很麻烦的,现在用AS了,感觉简单的就不止一点点了
1.首先从官网上下载NDK,并配置好环境变量
2.在AS的Structure里面配置好相应的路径
3.新建项目,并创建class文件
public class JniUtils { public static native String getString(); }
4.Make Project 后 在app\build\intermediates\classes\debug里面找到相信的Class文件
5.打开Terminal,cd到上面的debug文件夹中
6.javah -jni com.example.xf.jnidemo.Jniutils(包命加类名)命令来生成头文件
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_xiefei_jnidemo_JniUtils */ #ifndef _Included_com_example_xiefei_jnidemo_JniUtils #define _Included_com_example_xiefei_jnidemo_JniUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_xiefei_jnidemo_JniUtils * Method: getString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_xiefei_jnidemo_JniUtils_getString (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
成功后你就会在debug中发现.h的头文件,把头文件剪切,并在main文件夹中创建jni和jniLibs文件夹,把.h的头文件粘贴在jni里
7.在jni的文件夹中创建.c文件,文件名随便取
#include "com_example_xiefei_jnidemo_JniUtils.h" JNIEXPORT jstring JNICALL Java_com_example_xiefei_jnidemo_JniUtils_getString (JNIEnv *env, jclass obj){ return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!"); }
8.在app moudle中配置
defaultConfig { applicationId "com.example.xiefei.jnidemo" minSdkVersion 21 targetSdkVersion 25 versionCode 1 versionName "1.0" ndk{ moduleName "jniTest" abiFilters "x86","armeabi" } } sourceSets.main{ jni.srcDirs "src/main/jni" jniLibs.srcDir "src/main/jniLibs" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }配置好了 ndk 和 sourceSets.main后在gradle.properties中加上
android.useDeprecatedNdk=true
9.Build->Make Project,会自动生成.so库,保存的路劲为\app\build\intermediates\ndk\debug\lib
找到.so文件,copy到jniLibs文件夹
10,在用之前,我们用静态代码块来加载so库
static { System.loadLibrary("jniTest"); }嗯。。。其实还有个问题,我在配置这10步之后编译,报错
java.io.IOException:Could not delete folder path(就是开始那个debug文件夹的路径)
我也是百思不得其解,可能是由于JNI这块还不成熟吧,我多clean几次,又莫名奇妙的编译通过了。
好了,基本步骤也就这些了,后面还有新的东西我在记录
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("jniTest"); } private TextView content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); content = (TextView) findViewById(R.id.tv_content); content.setText(JniUtils.getString()); } }效果图就不展示了