JNI已经学习了一点,觉得开始记录下一些心得比较好,也为了以后自己的复习提高。
学习JNI也是从搭建环境开始的,网上流程很多不再赘述。
第一个JNI项目依旧是Hellojni,一开始使用的IDE是eclipse,现在换成Android studio,个人感觉android studio对jni的支持更好,更方便,不需要手动生成头文件,直接在java文件里添加本地方法,在 .cpp文件中添加对应的本地方法名即可使用。
在使用android studio生成项目的时候,通过添加本地支持,来生成支持c/c++的项目,生成的项目在MainActivity中会有如下代码:
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
此处是用于加载本地方法库,在项目中cpp文件夹里natvie-lib.cpp中的方法都可以在此java文件中调用,hellojni项目中调用的方法,需要如下声明
public native String stringFromJNI();
在应用调用本地的方法,返回hellojni字符串,在应用中显示,本地方法如下
extern "C"
JNIEXPORT jstring JNICALL
Java_com_seuic_ndkstudy_MainActivity_stringFromJNI(
JNIEnv *env,
jobject this )
{
std::string mString = "Hellojni";
return env->NewStringUTF(mString.c_str());
}
代码中std::string表示string类型是从std标准域中引用的,c_str()函数返回一个指向正规C字符串的指针,内容与本string串相同。这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
在项目中,新建一个TextView组建来显示jni返回的字符串
TextView tv1 = (TextView) findViewById(R.id.sample_text);
tv1.setText(stringFromJNI());
运行app时可以显示hellojni字符串,调用成功。