忽如一夜春风来,千树万树梨花开。听说android支持了c++开发,哥们那叫个happy。只可惜,现在才开始学习。搜啊搜,说是要用ndk。搜啊搜,知道了ndk是用c++写.so(windows下为dll),java来调用。搜啊搜,ndk里面sample是用了jni。搜啊搜,就有了自己的这篇入门随笔。欢迎大家讨论,但是不要骂人,你骂人爽了,可是你的娘亲可就要受苦了。废话不多说了,开整。
java需要安装jdk。jdk安装配置好后,就开始java代码了。
java代码:
public class testjni
{
//本人java业余菜鸟一枚,这个单独写个static是搞什么还请各位看官指点一番,能否将System.loadLibrary("calcjni");放到main的第一行执行?暗爽...
static
{
//调用calcjni.dll/.so 中的功能
//System.loadLibrary("calcjni");
}
//native 函数,这里声明,在C++中实现。这就类似于给你一个.h文件,一个dll,你就可以适用dll中到处都函数了。各种爽。
public native static int Add(int x,int y);
//同上
public native static int Subtract(int x,int y);
public static void main( String[] args)
{
//调用calcjni.dll/.so 中的功能,参考的样例中是写在外面的,我这里试试我的想法。
System.loadLibrary("calcjni");
testjni test = new testjni();
int addRe = test.Add(10,3);
int subRe = test.Subtract(10,3);
System.out.println("Add(10,3)="+addRe);
System.out.println("Subtract(10,3)="+subRe);
}
}
先将上面的代码编译 javac testjni.java得到testjni.class
然后javah testjni ,得到testjni.h。这个头文件,就是你想用c++来实现的功能。
下面该c++闪亮登场了。大家给点掌声,掌声再响亮些。
c++代码:
#include "testjni.h"
/*
* Class: testjni
* Method: Add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_testjni_Add
(JNIEnv *, jclass, jint x, jint y)
{
return x+y;
}
/*
* Class: testjni
* Method: Subtract
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_testjni_Subtract
(JNIEnv *, jclass, jint x, jint y)
{
return x-y;
}
当然,c++是要生成dll(windows系统),所以我用VS2010,win32,dll,emptyproject,然后导入testjni.h,编译生成calc.dll。
编译的时候会说jni.h,jni_md.h文件找不到。那就设置下包含路径吧。属性,c/c++常规,附加包含目录,将jni.h和jni_md.h文件所在的目录包含进来,jdk安装目录下的include和include/win32下。
然后把calc.dll拷贝到testjni.class目录下,执行java testjni 。得到结果。
这是我第一次折腾,算是为c++搞android做个技术储备吧。that's all,3Q.