之所以标题写这么长是希望有需求的朋友能搜索到。
长话短说,java为了调用c库,需要用到JNI(JAVA本地调用)。见百度百科的介绍:
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
那么如何使用它呢?我摸索了一天,头都疼了,也没搞定,下班迅速撤离公司,到家不甘心再打开笔记本,按照介绍的慢慢来,再找找针对错误提示的回答,居然解决了,所以整理好了供大家使用。mac os下,按照我的方法肯定能成功,linux的话,是很相近的,windows请再补充一点如何布置ndk的知识给自己。
第一步:布置ndk,到http://developer.android.com/tools/sdk/ndk/index.html下载对应操作系统的ndk包,下载后解压缩,建议放在跟android skd或javasdk相同的路径下,当然放在什么位置都无所谓。
第二步:布置环境变量
export NDK_HOME=/Users/dhn/devellop/android-ndk-r8b
export PATH=${PATH}:${NDK_HOME}
注意上述两行只是为了将ndk路径给PATH,NDK_HOME只是为了增强可读性。
将上面两行写入~/.bash_profile或/etc/profile,然后source ~/.bash_profile或source /etc/profile或者你重启shell终端,你懂的。
至此,ndk就算布置好了,可以使用了。那么如何使用呢?
我们新建一个android项目,然后创建一个文件HelloWorld.java,内容如下:
package com.example.androidtest;
public class HelloWorld {
public native long displayHelloWorld();
static {
System.loadLibrary("jnitest");
}
}
在项目入口文件中布置如下内容:
package com.example.androidtest;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.*;
public class MainActivity extends Activity {
private HelloWorld jt;
private TextView viewHello;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jt = new HelloWorld();
long jtl = jt.displayHelloWorld();
this.viewHello = (TextView) super.findViewById(R.id.hello);
this.viewHello.setText(""+jtl);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
注意布置相应的activity_main.xml。
然后在shell中进入到项目目录中的src/com/example/androidtest目录,也就是源码位置,执行javac HelloWorld.java,生成HelloWorld.class文件,注意这一步是编译java文件。
然后退回到src目录下,注意这一步很关键,必须退回到src下,也就是项目名的外面。
执行:javah com.example.androidtest.HelloWorld,即项目名.类名。
这时候在src下面会生成头文件:com_example_androidtest_HelloWorld.h
将这个头文件移动到项目中的jni目录(这个目录要先手动创建)下。
然后编写一个xxx.c,这里名字可以随便取,实现里面的函数。
内容如下:
#include <jni.h>
#include "com_example_androidtest_HelloWorld.h"
#include <stdio.h>
JNIEXPORT jlong JNICALL Java_com_example_androidtest_HelloWorld_displayHelloWorld(JNIEnv* env, jobject thiz) {
return 100;
}
写好后在jni目录中写一个Android.mk文件,内容如下:
注意第一行是LOCAL_MODULE,不要写错了。
然后退回到项目根目录中,即jni目录中执行cd ../,就是jni或src的上层目录。
执行ndk-build即可看到如下信息:
然后运行你的程序吧,你能看到启动程序后界面能显示你的返回值,就代表你成功了!