android通过jni接口与c、c++互调

都知道java和c的互相调用是通过jni接口,这里我也来说一下在andorid里面如果调用c和c++代码。

废话不多说这里我们的任务是在ADT里面能编译c/c++的源文件为.so的链接库。

工欲善其事必先利其器:

这里我们需要的器就是:

1:ndk 下载地址 http://developer.android.com/tools/sdk/ndk/index.html

2:ADT 就是android开发的eclipse开发环境

3: 安装一下CDT这样看c和c++的代码感觉舒服点

好了就这几个就够了,以前很多质料上面都说要用到cygwin但是我没有用到.

第一步:

下载好ndk解压到任何的一个地方。

第二步:

然后用ADT新建一个andorid工程我这里随便新建一个就叫androidndktest

第三部:

进入解压的ndk目录找到E:\android-ndk-r9c\samples\hello-jni这里面的jni东西拷贝到ADT的工程目录里面现在的样子一般就是这样

android通过jni接口与c、c++互调_第1张图片

好了我们继续:打开jni里面的hello-jni.c文件修改如下

#include 
#include 

/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
 */
jstring
Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{


    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI ");
}

这里我有必要解释一下,这个是我们的c代码,它的函数名字可能有点长,但是没关系,其实这是jni规定的最开始的Java反正你照着写就对了com_example_ndktest 这一串就是包名字了,后面的就是java的哪个类要调用它还有它的名字就这么简单,返回的是一个String的字符串,然后我们来看看在java里面怎么调用它
//声明c的接口
	public native String stringFromJNI();

	static {
		System.loadLibrary("hello-jni");
	}

最总要的就是这两句话 第一句是声明,第二句是加载编译好的so库,但是现在我们还没有编译,这里我们来配置好所有东西然后跑起来看看效果

在项目上右键properties然后出现这个界面选择builders新建一个然后看图配置android通过jni接口与c、c++互调_第2张图片android通过jni接口与c、c++互调_第3张图片


android通过jni接口与c、c++互调_第4张图片



配置完毕过后编译器就会自动编译了,编译完成过后点击run这样就可以在android上跑起来了。

android通过jni接口与c、c++互调_第5张图片

这里是我的java代码

public class MainActivity extends Activity {

	//声明c的接口
	public native String stringFromJNI();

	static {
		System.loadLibrary("hello-jni");
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		TextView textView = (TextView) findViewById(R.id.hello);
		textView.setText(stringFromJNI());
	}



}

你可能感兴趣的:(java,android)