本是一个Android菜鸟,仅仅会SDK开发怎么能行呢?学习一下NDK,也装一把,也为以后的职业声音奠定更好的基础(虽然Java出身没有必要拘泥于Java语言嘛).使用Android Studio按照官方说明,第一步就卡死了,在Wizard中check “Support C++”后,立即就报错了,有兴趣的同学请参考.既然Android Studio不行就返回Eclipse吧,尝试一下NDK开发.毕竟就是一个开发工具的差异.下面步入正题.
1.Java通过JNI调用C/C++模块部分:
package com.example.jni;
public class HelloJNI {
static {
System.loadLibrary("hellojni");
}
public native void helloJNI();
public static void main(String[] args) {
HelloJNI item = new HelloJNI();
item.helloJNI();
}
}
这里必须添加System.loadLibary,否则会
2.通过java编译头文件
$cd bin
$javah com.example.jni.HelloJNI
然后bin目录下就生成了com_example_jni_HelloJNI.h
其内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_HelloJNI */
#ifndef _Included_com_example_jni_HelloJNI
#define _Included_com_example_jni_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jni_HelloJNI
* Method: helloJNI
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jni_HelloJNI_helloJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3.使用Visual Studio完成hellojni.dll文件
我是个Visual Studio白痴,这里讲的详细一点作为备忘.
- 新建 “hellojni” project.下载Visual Studio Community Version.按照其提示规则进行一步步安装,New Project…->Visual C++,在右侧中选择Win32 Console Application(注意:如果右侧没有内容,会提示你进行下载.),这里起名 “hellojni”->Next->Application Type中选择 “DLL”->Finish.
- 导入.h文件. 打开项目工作区后,在右侧 “Solution Explorer”中 “Head Files”上右击Add->Add Existing Items 然后选中变生成的.h文件;虽然上一步选中了生成的.h文件,这里还需要把.h文件复制到hellojni工程的hellojni目录下面,少了copy后,编写hellojni.cpp时提示”cannot open source file xx.h”.
- 在Visual Studio中添加对jni的支持(PS:个人感觉和java的classpath有异曲同的意味),菜单栏 Debug ->hellojni Property Pages->VC Directories ->include libraries edit-> add jdk/include/win32;add jdk/include/. 然后要修改红线圈起来的部分为x64.
- 编写hellojni.cpp文件. 从.h文件中复制关于方法的声明,完成方法体.完整代码如下:
// hellojni.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
//引入头文件
#include "com_example_jni_HelloJNI.h"
#include <iostream>
/*
* Class: com_example_jni_HelloJNI
* Method: helloJNI
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jni_HelloJNI_helloJNI
(JNIEnv * env, jobject obj){
printf("hello jni。。。");
}
- 编译hellojni.cpp,生成hellojni.dll. Build->Build Solution.然后就在hellojni/x64/Debug下面就生成了hellojni.dll
4.将hellojni加入HelloJNI.java的编译路径进行测试. 将hellojni.dll复制到Eclipse使用的jre的bin/下面;Eclipse Run.
ok!
小试牛刀
上面的例子简单的有点过分了,这里咱们也打印一下自己的大名.步骤同上.修改一下HelloJNI.java和hellojni.cpp部分.
package com.example.jni;
public class HelloJNI {
static {
System.loadLibrary("hellojni");
}
public native void helloJNI(String name);
public static void main(String[] args) {
HelloJNI item = new HelloJNI();
item.helloJNI("guchuanhang");
}
}
// hellojni.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
//引入头文件
#include "com_example_jni_HelloJNI.h"
#include <iostream>
/*
* Class: com_example_jni_HelloJNI
* Method: helloJNI
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jni_HelloJNI_helloJNI
(JNIEnv * env, jobject obj,jstring param1){
const char* name = env->GetStringUTFChars(param1, 0);
printf("hello,JNI,I'm %s\n", name);
//注意c++里面必须自己释放,java是有一个自动的垃圾回收器
env->ReleaseStringUTFChars(param1, name);
return;
}