zoukankan      html  css  js  c++  java
  • [转]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
  • 相关阅读:
    linux 解压tgz 文件指令
    shell 脚本没有执行权限 报错 bash: ./myshell.sh: Permission denied
    linux 启动solr 报错 Your Max Processes Limit is currently 31202. It should be set to 65000 to avoid operational disruption.
    远程查询批量导入数据
    修改 MZTreeView 赋权节点父节点选中子节点自动选中的问题
    关于乱码的问题解决记录
    我的网站优化之路
    对设计及重构的一点反思
    我的五年岁月
    奔三的路上
  • 原文地址:https://www.cnblogs.com/aituming/p/5991265.html
Copyright © 2011-2022 走看看