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.o
JavaJNI.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