前文参考:http://www.gaohaiyan.com/3695.html
首先,当然是在本地实现java方法。
然后,定义一个JNINativeMethod类型的数组,对本地函数和java方法进行配对。
接着,jni中声明了一个JNI_OnLoad函数,当java通过System.loadLibrary加载库文件时,jvm自动调用。我们在此函数中,创建一个JNIEnv上下文对象。
最后,通过RegisterNatives函数,对本地函数和java方法进行注册。
最终java中就可以调用了。
Java声明,加载,及调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class MyTest { static { System.loadLibrary("JniTest"); } public static void main(String[] args) { String r = getJniString(); System.out.println(r); // 如果要改变java方法的实现,可以实现新的库,再次注册。 // System.loadLibrary("JniTest-2"); } public static native String getJniString(); // 在jni中创建java String // javac MyTest.java // java MyTest } |
C++实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#include "jni.h" #include <iostream> #include <string> #ifndef _Included_MyTest #define _Included_MyTest using namespace std; #ifdef __cplusplus extern "C" { #endif // 本地函数,实现java方法 jstring getString(JNIEnv *env, jclass clazz) { string s2 = "这里是来自c++的string"; const char *b = s2.data(); jstring str = env->NewStringUTF(b); return str; } // 本地函数和java方法的映射表 JNINativeMethod fs[] = { // warning: conversion from string literal to 'char *' is deprecated // java方法,签名:参数和返回值,本地函数 {"getJniString", "()Ljava/lang/String;", (void *)getString}, // {}, 更多映射 }; // 注册本地函数,与java方法关联 jint registMethods(JNIEnv *env) { jclass klass = env->FindClass("MyTest"); // java方法所在的类 return env->RegisterNatives(klass, fs, sizeof(fs) / sizeof(fs[0])); // 注册(类,映射表,数量) } // java中 // System.loadLibrary("JniTest"); // 时,自动调用此函数 // vm:java虚拟机 jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env; jint r = vm->GetEnv((void **)&env, JNI_VERSION_1_6); if (r == JNI_OK) { registMethods(env); } return JNI_VERSION_1_6; // 这里返回的是版本号。否则 UnsatisfiedLinkError: unsupported JNI version 0x00000000 } #ifdef __cplusplus } #endif #endif // gcc -dynamiclib -lstdc++ -o libJniTest.dylib JniTest.cc |
- end
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/3723.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设