JNI的简单使用
1、创建项目,创建Jni.java
public class Jni {
private static final String TAG = "piao.yezi.jnidemo2.jni.Jni";
public native String getJniString();
static {
System.loadLibrary("Jni");
}
}
2、 Terminal命令:
cd Module名/build/intermediates/classes/debug/
生成h头文件,命令如下;
javah -jni piao.yezi.jnidemo2.jni.Jni
(上一行的最后Jni为类名)
在main下创建jni Package,拷贝头文件到指定目录,命令如下:
cp piao_yezi_jnidemo2_jni_Jni.h../../../../src/main/jni/
3、创建和h头文件同名的c文件,include头文件:
h文件内容为:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class piao_yezi_jnidemo2_jni_Jni */ #ifndef _Included_piao_yezi_jnidemo2_jni_Jni #define _Included_piao_yezi_jnidemo2_jni_Jni #ifdef __cplusplus extern "C" { #endif /* * Class: piao_yezi_jnidemo2_jni_Jni * Method: getJniString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_piao_yezi_jnidemo2_jni_Jni_getJniString (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
c文件文件内容为:
// // Created by yezi on 2017/3/9. // #include "piao_yezi_jnidemo2_jni_Jni.h" jstring JNICALL Java_piao_yezi_jnidemo2_jni_Jni_getJniString (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"Hello from jni!!!"); }
4、在module的build.gridle文件的配置ndk
defaultConfig { applicationId "piao.yezi.jnidemo2" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" ndk { moduleName "Jni" //生成so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //生成支持的平台 } }
5、 在Android模式下,打开Gradle Scripts,找到gradle.properties文件,打开,在最后一行添加,配置使用c/c++
android.useDeprecatedNdk = true
6、在MainActivity中调用native方法
package piao.yezi.jnidemo2; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import piao.yezi.jnidemo2.jni.Jni; public class MainActivity extends AppCompatActivity { private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mText = ((TextView) findViewById(R.id.text)); Jni jni = new Jni(); mText.setText(jni.getJniString()); } }