JNI for Android

本文详细介绍了如何在Android环境中利用JNI技术调用C/C++代码。从创建项目开始,逐步指导如何声明本地方法、生成并编译本地代码,直至最终在Android应用中成功调用这些本地方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android中的JNI

JNI就是java的本地调用,调用本地用C、C++实现的接口,使用环境是Eclipse  and  ubuntu 10.10;实现方法步骤是:

1.    新建Android Project ;

2.    然后在实现了该有的方法以外,还要声明本地调用的方法,使用关机字native声明,并且只是声明没有实现,如:

public static native String return_string();

3.    写好Android代码以后进行编译生成.class文件;

4.    使用java的javah命令生成.h文件,由于在Android中生成有点特别,需要转到src目录下才能生成;

如:cd  workspace/JNItest/src

   Javah com.example.jnitest.MainActivity    之后就生成了.h文件了,如:



5.   编写本地实现部分,也就是.c or  .cpp文件,并且在其中是方法内容,如:

   #include <string.h>
#include <jni.h>
#include "com_example_jnitest_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_return_1string(JNIEnv *env, jclass)
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

6.在自己创建的Android Project 下建文件夹jni,并且把.h文件和.c  or  .cpp文件拷贝到该目录下,并创建Android.mk文件,注意:在这的文件名必须是如所示的,

否则在生成.so是无法成功,如:


Android.mk文件的内容是:

    LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -fvisibility=hidden  
LOCAL_ARM_MODE := arm  
LOCAL_LDLIBS :=-L$(SYSROOT)/usr/lib -llog  
LOCAL_SRC_FILES := com_example_jnitest_MainActivity.c  
LOCAL_MODULE := return_string  
include $(BUILD_SHARED_LIBRARY)

7.  把整个Android Project copy unbuntu系统下,并且已经在ubuntu系统下安装了NDK ,那么转到Android Project下,也就是cd  /home/JNItest    之后再使用NDK命令来生成so文件,使用:$NDK/ndk-build 就生成了.so文件,如:



8.在把生成soAndroid Project转到Eclipes中,在重新RUN就可以实现JNI了,如同所示:




Android  code:

   package com.example.jnitest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	private Button MyJNI;
	private TextView myOutput;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		MyJNI=(Button)findViewById(R.id.myJNI);
		myOutput=(TextView)findViewById(R.id.myOutput);
		
		MyJNI.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				myOutput.setText(return_string());
			}
			
		});
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	public static native String return_string();
	static{
		System.loadLibrary("return_string");
	}

}


在unbuntu线安装NDK的方法是:

1.    下载NDK:http://developer.android.com/sdk/ndk/index.html 在此下了android-ndk-r9;

2.    解压文件,并转到该目录下,使用getdit  ~/.bashrc打开文件进行增加:NDK=/home/android-ndk-r9

3.    使用source  ~/.bashrc进行重生成;

4.    验证echo  $NDK  ,有内容输出则配置成功;

5.   之后就可以转到Android Project下使用$NDK/ndk-build进行生成so了。

6.   生成so完成






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值