JNI开发的一个简单Demo

1、创建工程

1.1、创建TestJni

      创建一个JNI的工程与创建一个普通的Android工程并无两样,但是会再添加一个名为jni的目录,如下图所示:


1.2、创建文件

        在创建完成TestJni目录之后,需要在该目录下创建一些文件,名为:Android.mk,Application.mk以及我们的C文件hello-jni(这里的C文件笔者直接使用的Android官方给的例子,便于大家查看复制,免得自己敲错了)。



2、配置文件

2.1、Android.mk

      该文件在之前有过详细说明,这里不再赘述,我们直接看源码:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

include $(BUILD_SHARED_LIBRARY)


2.2、Application.mk

      该文件中只有一句代码,我们先来看看:

APP_ABI := all
       本行代码的意思是,将C文件编译在运行的各种平台上的so文件。常见平台有arm,arm-v7,x86,mips等。


3、C文件源码

       避免大家到处找不到该文件,这里我也直接将C文件贴出来好了:

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

/* 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_testjni_MainActivity_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
#if defined(__arm__)
  #if defined(__ARM_ARCH_7A__)
    #if defined(__ARM_NEON__)
      #define ABI "armeabi-v7a/NEON"
    #else
      #define ABI "armeabi-v7a"
    #endif
  #else
   #define ABI "armeabi"
  #endif
#elif defined(__i386__)
   #define ABI "x86"
#elif defined(__mips__)
   #define ABI "mips"
#else
   #define ABI "unknown"
#endif

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

4、Java源码

      这里提供一个很简单的JAVA调用程序:

package com.example.testjni;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
	
	static {
        System.loadLibrary("hello-jni");
    }

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
//		setContentView(R.layout.activity_main);
		
		TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
	}
	
	public native String  stringFromJNI();
	public native String  unimplementedStringFromJNI();
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}

5、执行程序

      如何执行程序,请大家参照之前的博文中如何搭建NDK开发环境中的文章:http://blog.csdn.net/ljtyzhr/article/details/39957187

      如果程序正确无误,那么大家应该在控制台看大如下所示的提示信息,就表示程序配置成功了:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值