JNI是一种本地编程接口。它允许运行在JAVA虚拟机中的JAVA代码和用其他编程语言,诸如C语言、C++、汇编,写的应用和库之间的交互操作。
第一个JNI程序
使用as创建一个新的工程 选择 include C++ support 选项之后 直接next;
目录结构
内容
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.test.jnitest"
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
//指定cmake的配置文件
path "CMakeLists.txt"
}
}
}
Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
主要的内容的这样的
布局文件中有个TextView控件
将这个textView的文本设置成,jni中的文本
static {
System.loadLibrary("native-lib");
}
这里动态设置链接库
public native String stringFromJNI();
定义native方法
JNIEXPORT jstring JNICALL
Java_com_test_jnitest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
调用后会返回Hello from C++ 并将TextView控件赋值
jni基础介绍
JNIEXPORT jstring JNICALL
Java_com_test_jnitest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
JNIEXPORT 和 JNICALL 是一个宏定义,定义在jni_md.h头文件中。
jstring 是返回类型对应着java的String类型
具体如下
Java类型 | 本地类型 | 描述 |
---|---|---|
boolean | jboolean | C/C++8位整型 |
byte | jbyte | C/C++带符号的8位整型 |
char | jchar | C/C++无符号的16位整型 |
short | jshort | C/C++带符号的16位整型 |
int | jint | C/C++带符号的32位整型 |
long | jlong | C/C++带符号的64位整型 |
float | jfloat | C/C++32位浮点型 |
double | jdouble | C/C++64位浮点型 |
Object | jobject | 任何Java对象,或者没有对应java类型的对象 |
Class | jclass | Class对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 任何对象的数组 |
boolean[] | jbooleanArray | 布尔型数组 |
byte[] | jbyteArray | 比特型数组 |
char[] | jcharArray | 字符型数组 |
short[] | jshortArray | 短整型数组 |
int[] | jintArray | 整型数组 |
long[] | jlongArray | 长整型数组 |
float[] | jfloatArray | 浮点型数组 |
double[] | jdoubleArray | 双浮点型数组 |
Java_com_test_jnitest_MainActivity_stringFromJNI(JNIEnv *env, jobject )
Java_之后添加方法的完全名 .用_替换 得到链接到的方法名
JNIEnv: 由Jvm传入与线程相关的变量。定义了JNI系统操作、java交互等方法。
jobject: 表示当前调用对象,即 this , 如果是静态的native方法,则获得jclass