JNI 学习-Java 调用C

http://blog.csdn.net/kenera/archive/2009/02/16/3895343.aspx

给了极大的指导。

说说我的操作过程吧

1 MyEclipse 里新建Java 项目......主要代码如下:

package com.isw2.jni;

public class JNIStudy {
	{
		System.loadLibrary("testJNI");//加载DLL 文件,后缀因为windows 和linux 不同这里由系判断
	}
	public native void display();//native 指明方法由项目以外的程序实现
	public static void main(String[] args) {
		JNIStudy study = new JNIStudy();
		study.display();//使用
	}
}
 

2 分别执行下面的命令。第二条用来获取com_isw2_jni_JNIStudy.h  文件。com_isw2_jni_JNIStudy.h在创建dll文件时会用到.

E:\work\JNIstudy\src>javac com/isw2/jni/JNIStudy.java

E:\work\JNIstudy\src>javah com.isw2.jni.JNIStudy

 3新建C项目.复制com_isw2_jni_JNIStudy.h.之后生成 testJNI.dll

dll.h (复制com_isw2_jni_JNIStudy.h)如下:

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

#ifndef _Included_com_isw2_jni_JNIStudy
#define _Included_com_isw2_jni_JNIStudy
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_isw2_jni_JNIStudy
 * Method:    display
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_isw2_jni_JNIStudy_display
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
 

dllmain.c 如下:

#include <jni.h>
#include "dll.h"
#include <stdio.h>
//注意方法名 ,来源于 dll.h 
JNIEXPORT void JNICALL 
Java_com_isw2_jni_JNIStudy_display
  (JNIEnv *, jobject)
{
    printf("Hello word!\n");
    printf("void com.isw2.jni.JNIStudy.display() \n");
    return;
}

 

带参数的如下:

JNIEXPORT jstring JNICALL Java_com_isw2_jni_JNIStudy_display
  (JNIEnv *env, jobject obj, jstring arg){  
     const char *nativeString = (*env)->GetStringUTFChars(env,arg, 0);  
     printf("dllmain.c run result %s", nativeString);    
     (*env)->ReleaseStringUTFChars(env,arg, nativeString);  
     return arg;     
}

 编译过程中需要jni.h  可以%JAVA_HOME%下面的 /include 中找到,加上win32中的    一起放到   D:\DEV-CPP\Include  (dev-cpp 是我用的C++工具)下面.

 

之后 testJNI.dll 放到 C:\WINDOWS\system32 下面。再运行Java 代码结果就出来了.

 

你可能感兴趣的:(java,C++,c,C#,jni)