JNI的学习(Java调用C++函数,通过DLL)

4 篇文章 0 订阅
4 篇文章 0 订阅

1. 打开Eclipse创建一个Java工程叫JvmTest1,包名叫:test,类名叫:DemoNative

工程被创建在:C:\dev\proj\android\workspace\JvmTest1


2.DemoNative.java当中的内容如下:

package test;

public class DemoNative 
{
	public native void sayHello();
	
	public void sayHello2()
	{
		System.out.println("Hello sonikk From Java !");
	}
}

3. 使用javah命令自动生成头文件

 进入cmd

# c:

# cd C:\dev\proj\android\workspace\JvmTest1\src

# javah test.DemoNative

这样在C:\dev\proj\android\workspace\JvmTest1\src目录下就会生成一个c++的.h头文件

test_DemoNative.h

内容如下:

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

#ifndef _Included_test_DemoNative
#define _Included_test_DemoNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test_DemoNative
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_test_DemoNative_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4. 创建一个C++的Dll工程

选择Win32 Console Application,工程名字叫NativeDemo,

设置工程:

Additional Include Directories:

C:\Program Files\Java\jdk1.7.0_07\include

C:\Program Files\Java\jdk1.7.0_07\include\win32


test_DemoNative.h: (注意将#include <jni.h> 更改为 #include "jni.h")

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

#ifndef _Included_test_DemoNative
#define _Included_test_DemoNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test_DemoNative
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_test_DemoNative_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

创建一个main.cpp:

#include "test_DemoNative.h"

#include <iostream>
using namespace std;

JNIEXPORT void JNICALL Java_test_DemoNative_sayHello(JNIEnv *env, jobject obj)
{
	cout<<"Hello sonikk!"<<endl;
}

执行编译,这样就会看到:

1>Build succeeded.
1>
1>Time Elapsed 00:00:00.64
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

然后将Debug目录下的NativeDemo.dll,命名为dNativeDemo.dll,表示是debug版本。


将dNativeDemo.dll复制到:

C:\dev\proj\android\workspace\JvmTest1\libs\dNativeDemo.dll

打开Eclipse的Java工程,先进行Refresh,然后进行工程设置:

Properties -> Java Build Path -> Source -> 展开JvmTest1/src -> Native library location

双击,或者点击 Edit...

输入C:/dev/proj/android/workspace/JvmTest1/libs/



修改DemoNative.java:

package test;

public class DemoNative 
{
	public native void sayHello();
	
	public void sayHello2()
	{
		System.out.println("Hello sonikk From Java !");
	}
	
	public static void main(String[] args)
	{
		System.loadLibrary("dNativeDemo");
		DemoNative  demo = new DemoNative(); 
		demo.sayHello(); 
	}
}



运行工程:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\dev\proj\android\workspace\JvmTest1\libs\NativeDemo.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(Unknown Source)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at test.DemoNative.main(DemoNative.java:14)


是什么原因呢?怎么办呢?

原来是之前的vs2010工程生成的DLL是x86 platform的,现在需要改变一下工程的设置,以x64 paltform输出DLL



右上角有一个按钮 Configration Manager,选择Active solution paltform,更改Type or select the new platform 为 x64,

重新编译工程,结果新的DLL被输出到了:

NativeDemo\x64\Debug下

从之前的36KB变成了40KB,

同样将名字改为dNativeDemo.dll,然后拷贝到Java工程目录的libs下,设置不变。


运行,成功,OK!!!   \(^_^*





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值