• [转]Ubuntu下使用Jni开发例子


     
    先用eclipse 创建 Java Project;
    然后直接在项目中添加Prompt.java文件,放在default package下(最好不要添加包,否则容易出错)。
     
    1. 编写Java文件,在其中声明native方法, 并通过static 语句块加载动态链接库,示例Prompt.java代码如下:
    class Prompt {
        private native String getLine(String prompt);
     
        public static void main(String args[]) {
            Prompt p = new Prompt();
            String input = p.getLine("Type a line: ");
            System.out.println("User typed: " + input);
        }
     
        static {
            System.loadLibrary("Prompt");  //这里到so库名千万别搞错了, Prompt对应的实际库名称是libPrompt.so
        }
    }
     
    2.调用javac命令生成Prompt.class文件;
    javac Prompt.java
    3.调用javah命令生成Prompt.h头文件供C程序引用:
    javah -jni Prompt
    自动生成的头文件如下:
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Prompt */
     
    #ifndef _Included_Prompt
    #define _Included_Prompt
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     Prompt
     * Method:    getLine
     * Signature: (Ljava/lang/String;)Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_Prompt_getLine
      (JNIEnv *, jobject, jstring);
     
    #ifdef __cplusplus
    }
    #endif
    #endif
    4.编写Prompt.c文件实现具体功能:
    #include <jni.h>
    #include <stdio.h>
    #include "Prompt.h"
     
    JNIEXPORT void JNICALL
    Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) 
    {
        char buf[128];
        const jbyte *str;
        str = (*env)->GetStringUTFChars(env, prompt, NULL);
        if(str == NULL) {
            return NULL;        
        }
        printf("%s", str);
        (*env)->ReleaseStringUTFChars(env, prompt, str);
        scanf("%s", buf);
        return (*env)->NewStringUTF(env, buf);
    }
    5. 编译动态库libPrompt.so;
    可能会报如下错误:

    /usr/bin/ld: /tmp/ccG1IYKj.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /tmp/ccG1IYKj.o: error adding symbols: 错误的值
    collect2: error: ld returned 1 exit status

    加上编译选项-fPIC即可;
    gcc -shared -fpic -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux Prompt.c -o libPrompt.so
    (gcc -shared -fPIC -I /opt/Java/jdk1.8.0_71/include/ -I /opt/Java/jdk1.8.0_71/include/linux/ Prompt.c -o libPrompt.so)
     
    6. 运行。
    java Prompt
    可能会报如下错误

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no test in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at Test.<clinit>(Test.java:14)

    需要设置java.library.path的路径来执行:

    java -Djava.library.path=. Prompt
  • 相关阅读:
    "未能加载文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件"的解决方案
    035——VUE中表单控件处理之使用vue控制select操作文字栏目列表
    034——VUE中表单控件处理之使用vue控制radio表单的实例操作
    033——VUE中安装使用vue-devtools调试工具用于监控数据变化
    015PHP基础知识——流程控制(三)
    014PHP基础知识——流程控制(二)
    032——VUE中表单控件处理之复选框的处理
    031——VUE中表单控件处理之使用vue控制input和textarea表单项
    030——VUE中鼠标语义修饰符
    029——VUE中键盘语义修饰符
  • 原文地址:https://www.cnblogs.com/aituming/p/5991265.html
Copyright © 2020-2023  润新知