zoukankan      html  css  js  c++  java
  • JNI用法小例子

    一、准备包含本地方法的.java文件(ContentVideo.java),包括set()和get()两个方法。

    public class ContentVideo {
    
        public native static String get(); //对将要调用的方法做本地声明
        public native static void set(int i);static
        {
            System.loadLibrary("InputFormatSo"); //在类中声明所调用的库名称
        }
    
    }

    二、生成对应的.h文件

    javah -jni ContentVideo

    三、根据ContentVideo.h文件,编写自己的ContentVideo.cpp文件,ContentVideo.cpp内容如下:

    #include "ContentVideo.h"
    #include <string>
    #include<string.h>
    using namespace std;
    int i = 0;
    //char* to jstring
    jstring stoJstring(JNIEnv* env, const char* pat)
    {
           jclass strClass = env->FindClass("Ljava/lang/String;");
           jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
           jbyteArray bytes = env->NewByteArray(strlen(pat));
           env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
           jstring encoding = env->NewStringUTF("utf-8");
           return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
    }
    
    JNIEXPORT jstring JNICALL Java_ContentVideo_get
      (JNIEnv* env, jclass) {
        if(i >= 0 && i < 60) {
            return stoJstring(env, "bad");
        }
        else if(i >= 61 && i < 90) {
            return stoJstring(env, "ok");
        }
        else if(i >= 90 && i <= 100) {
            return stoJstring(env, "good");
        }
        else {
            return stoJstring(env, "input data is wrong");
        }
    }
    
    
    JNIEXPORT void JNICALL Java_ContentVideo_set
      (JNIEnv *, jclass, jint m) {
    
        i = m;
    }

    四、编译.cpp文件,生成对应的.so文件,即libInputFormatSo.so

         Makefile文件内容如下:

    g++ -o libInputFormatSo.so ContentVideo.cpp -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -fPIC -shared
    sudo cp libInputFormatSo.so /usr/lib  #把libInputFormatSo.so加到java.library.path路径下

    五、编写Java主程序文件(ContentMain.java),该程序会调用含有本地方法的Java类ContentVideo,主程序如下:

    public class ContentMain {
    
            public static void main(String[] args) {
               ContentVideo.set(Integer.parseInt(args[0]));
               System.out.println(ContentVideo.get());
            }
    }

    六、编译ContentMain.java并运行类ContentMain

    javac ContentMain.java
    java ContentMain 12

    最终程序输出结果:bad

  • 相关阅读:
    dremio mysql arp integer 超出最大值的问题
    cube.js bi connector 实现说明
    cube.js 最新版本特性
    PLSQL Developer使用大全
    Git回滚Merge
    建模与外化:操纵抽象的能力
    Oc的异常触发
    iOS开发:Release/Debug模式与Configuration
    技术解耦和团队解耦
    头文件的作用—声明符号、类型、函数而不是定义变量
  • 原文地址:https://www.cnblogs.com/lasclocker/p/4648376.html
Copyright © 2011-2022 走看看