使用JNINativeMethod符號表的例子(Hello-jni例子C++版本)
阿新 • • 發佈:2019-01-06
-
#include <stdio.h>
-
#include <jni.h>
-
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv * env, jobject obj)
-
{
-
return env->NewStringUTF( (char *)"HelloJni Native String");
-
}
-
static JNINativeMethod methods[] = {
-
{"stringFromJNI", "()Ljava/lang/String;", (void*)Java_com_example_hellojni_HelloJni_stringFromJNI },
-
};
-
static const char *classPathName = "com/example/hellojni/HelloJni";
-
/*
-
* Register several native methods for one class.
-
*/
-
static int registerNativeMethods(JNIEnv* env, const char* className,
-
JNINativeMethod* gMethods, int numMethods)
-
{
-
jclass clazz;
-
fprintf(stderr, "RegisterNatives start for '%s'", className);
-
clazz = env->FindClass(className);
-
if (clazz == NULL) {
-
fprintf(stderr, "Native registration unable to find class '%s'", className);
-
return JNI_FALSE;
-
}
-
if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
-
fprintf(stderr, "RegisterNatives failed for '%s'", className);
-
return JNI_FALSE;
-
}
-
return JNI_TRUE;
-
}
-
/*
-
* Register native methods for all classes we know about.
-
*
-
* returns JNI_TRUE on success.
-
*/
-
static int registerNatives(JNIEnv* env)
-
{
-
if (!registerNativeMethods(env, classPathName,
-
methods, sizeof(methods) / sizeof(methods[0]))) {
-
return JNI_FALSE;
-
}
-
return JNI_TRUE;
-
}
-
// ----------------------------------------------------------------------------
-
/*
-
* This is called by the VM when the shared library is first loaded.
-
*/
-
typedef union {
-
JNIEnv* env;
-
void* venv;
-
} UnionJNIEnvToVoid;
-
jint JNI_OnLoad(JavaVM* vm, void* reserved)
-
{
-
UnionJNIEnvToVoid uenv;
-
uenv.venv = NULL;
-
jint result = -1;
-
JNIEnv* env = NULL;
-
printf("JNI_OnLoad");
-
if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
-
fprintf(stderr, "GetEnv failed");
-
goto bail;
-
}
-
env = uenv.env;
-
if (registerNatives(env) != JNI_TRUE) {
-
fprintf(stderr, "GetEnv failed");
-
goto bail;
-
}
-
result = JNI_VERSION_1_4;
-
bail:
-
return result;
- }