java调用C程序
2018-11-22 08:42:17来源:博客园 阅读 ()
案例
如下:
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!\n", 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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash