stringFromJNI包含native关键字来提示Java编译器,这个方法的实现由其他的语言来提供的。这个方法有一堆括号来介绍,因为这个本地的方法没有必要有一个函数体。
public native String stringFromJNI();
2.加载共享库
native方法能够被编译进一个共享库。这个共享库需要被首先加载对于这个虚拟机来发现这个本地方法的实现。这个java.lang.system类提供两个静态的方法,加载和加载类库,对于在运行时间加载共享库。
static {
System.loadLibrary("hello-jni");
}
尽管由Android NDK产生的实际共享库以libhello-jni.so命名,这个loadLibrary方法仅仅去这个库的名字,hello-jni。LoadLibrary并不包含共享库的位置。这个Java类库的路径,系统配置java.library.path,有loadLibrary方法将要寻找的目录列表。这个Java类库在Android包含/vendero/lib和/system/lib.
3.本地方法的实现
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
自动的在共享库中发现这个方法。
javah –classpath bin/classes com.example.hellojni.HelloJni来产生C++,c的头文件
包含该头文件,实现方法。
4.方法的定义
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI
(JNIEnv *, jobject);
其中JNIEnv指向的是一个helloJni类的实例对象的一个接口指针。取决于一个本地的代码是C或者C++源文件,这个调用JNI方法的语法是不同的。在C代码中,JNIEnv是一个指向JNINativeInterface结构的指针。由于不知道目前的JNI环境,这个JNIEnv实例被当做第一个参数给了每个JNI函数调用。return (*env)->NewStringUTF(env, "Hello from JNI !");在C++代码,JNIENv实际上市,一个C++类的实例。return env->NewStringUTF("Hello from JNI !");
方法又分为实例方法和静态方法。
实例方法中存放的是类的实例。
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI
(JNIEnv * env, jobject thiz);
静态的方法中存放的是类。
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI
(JNIEnv * env, jclass clazz);