java jni

来源:互联网 发布:嗒啦咚吧一首网络歌曲 编辑:程序博客网 时间:2024/05/16 05:30

cmd下javac 错误: 编码GBK的不可映射字符

javac -encoding utf-8 文件名

这里写图片描述

javac -encoding utf-8 JavaJNI.java

这里写图片描述

javah -encoding utf-8 -classpath E:\mycode\Cripac\JniDemo\src\main\java jni.JniDemo.JavaJNI

javah 错误: 找不到 ‘XX’ 的类文件或Exception in thread “main” name: XX.class
http://blog.csdn.net/aattxx/article/details/70344448

jni
http://blog.csdn.net/zhangmingbao2016/article/details/52779096
http://blog.csdn.net/u010212643/article/details/69567391

在eclipse下,已经编译好class文件,所以无需自己编译

javah -classpath E:\mycode_scala\JniDemo\target\classes -encoding utf-8 jni.JniDemo.JavaJNI

生成的文件如下,注意,包含有包名
这里写图片描述

jni_JniDemo_JavaJNI.h 的文件内容如下:
这里写图片描述

JavaJNI.c的文件内容如下:
这里写图片描述

/*导入刚才生成的头文件*/#include "jni_JniDemo_JavaJNI.h"#include <stdio.h>/*头文件中的方法实现,直接将头文件中的方法原型复制过来加以实现即可,注意添加形参变量,*/  JNIEXPORT void JNICALL Java_jni_JniDemo_JavaJNI_printstr__  (JNIEnv *env, jobject obj)  {    printf("%s\n","woshiwucanjni" );    return;  }  JNIEXPORT void JNICALL Java_jni_JniDemo_JavaJNI_printstr__Ljava_lang_String_2  (JNIEnv *env, jobject obj, jstring string)  {    const char *str = (*env)->GetStringUTFChars(env, string, 0);    printf("%s!\n", str);  }

Makefile文件内容如下:

JavaJNI.so:JavaJNI.o    gcc -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux" -shared -o JavaJNI.so JavaJNI.oJavaJNI.o:JavaJNI.c    gcc -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux" -c -fPIC -o JavaJNI.o JavaJNI.c

注意,gcc前必须用Tab,可以解决如下错误

Makefile:2: *** missing separator. Stop
Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx.xxx.HelloWorld.myprint()V

没有myprint方法,类库加载没有问题,就是复制.h文件的时候,复制对方法

Could not find or load main class

在命令后加上 -classpath 包的父路径
http://blog.csdn.net/shymi1991/article/details/50540214

执行的时候

System.load("/home/jun.li/monitor.test/src/native/CudaMonitor4j/Release/libCudaMonitor4j.so")java -classpath /home/vpe.cripac/projects/jun.li/JniDemo/target/classes jni.JniDemo.JavaJNI或者java -jar /home/vpe.cripac/projects/jun.li/JniDemo/target/JniDemo-0.0.1-SNAPSHOT.jar
System.loadLibrary("CudaMonitor4j");java.lang.UnsatisfiedLinkError: no CudaMonitor4j in java.library.path
java -Djava.library.path=/home/jun.li/monitor.test/lib/x64:$CLASSPATH -jar monitor.test-0.0.1-SNAPSHOT-full.jar 

在执行前,要make,而且CudaMonitor4j的.so文件名是libCudaMonitor4j.so

java JNI调用C语言动态链接库(java.lang.UnsatisfiedLinkError: no yourClassName in java.library.path 异常的解决方法)
http://blog.csdn.net/pacosonswjtu/article/details/50618033

原创粉丝点击