java调用C程序

案例
如下:
package com.laction.so
linux:/mnt/zddom/com/laction/so
-rw-r--r--. 1 root root 922 Nov 13 14:30 HelloJNI.class
-rw-r--r--. 1 root root 463 Nov 13 14:29 HelloJNI.java

HelloJNI.java
package com.laction.so;

public class HelloJNI {

public native void printHello();

public native void printString(String str);

public native String printStringRetrun(String str);

static {
System.loadLibrary("HelloJNI");
}

public static void main(String args[]) {
HelloJNI myJNI = new HelloJNI();

myJNI.printHello();
myJNI.printString("Hello World from printString fun");
System.out.println("java:" + myJNI.printStringRetrun("test"));
}
}

//操作要放在mnt/zddom中
javac com/laction/so/HelloJNI.java
会在同一个目录中生成class文件

接下来生成.h文件
com_laction_so_HelloJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_laction_so_HelloJNI */

#ifndef _Included_com_laction_so_HelloJNI
#define _Included_com_laction_so_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_laction_so_HelloJNI
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printHello
(JNIEnv *, jobject);

/*
* Class: com_laction_so_HelloJNI
* Method: printString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printString
(JNIEnv *, jobject, jstring);

/*
* Class: com_laction_ljw_so_HelloJNI
* Method: printStringRetrun
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_laction_so_HelloJNI_printStringRetrun
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

上面生成的文件需要简单的改动一下,如下:类型加参数

JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printHello
(JNIEnv * env, jobject o);


完整文件参数例子


com_laction_so_HelloJNI.c

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "com_laction_so_HelloJNI.h"

#include <stdio.h>

/* Header for class com_laction_so_HelloJNI */


/*
* Class: com_laction_so_HelloJNI
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printHello(JNIEnv * env, jobject o)
{
return ;
}

/*
* Class: com_laction_so_HelloJNI
* Method: printString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printString(JNIEnv * env, jobject o, jstring s)
{

const char *str = (*env)->GetStringUTFChars(env,s,0);
//printf("%s! ", str);

return;
}


/*
* Class: com_laction_so_HelloJNI
* Method: printStringRetrun
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_laction_so_HelloJNI_printStringRetrun(JNIEnv * env, jobject o, jstring s)
{
return s;
}

//操作要放在mnt/zddom中
gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o HelloJNI.so com_laction_ljw_so_HelloJNI.c

HelloJNI.so

如果顺利生成so文件,则ok
如果不能,则检查路径和java.library.path




如何找java.library.path

/************如何找java.library.path***************/

public class HelloWorld{  
  
public static void main(String args[]){  
  
System.out.println("Hello! World");  
System.out.println(System.getProperty("java.library.path"));  
  
}  
  


/************自定义一个文件夹***************/
常见问题:no HelloNative in java.library.path
如:
/mnt/so

修改/etc/profile

vim /etc/profile
/////
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export MAVEN_HOME=/usr/local/maven/maven3
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
加入
LD_LIBRARY_PATH=/mnt/so
export LD_LIBRARY_PATH

原文地址:https://www.cnblogs.com/dragon16/p/9990242.html