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!!! \(^_^*