JNI开发环境搭建及第一个JNI小例子

34 篇文章 0 订阅
17 篇文章 0 订阅

          本人用的是GNUStep + NDK +Eclipse开发JNI。

GNUStep是模拟Linux的开发环境。


废话不多说,直接上步骤:

1、下载GNUStep 并安装

         下载地址http://www.gnustep.org/experience/Windows.html

         进入下载界面可以看到如下的界面

       


        前面两项是必须的(GNUstep MSYS System ,GNUstep Core),点击Stable下的绿色版本号进入下载,后略 。。安装时按如图的上下顺序依次安装。


2、下载安装后,验证是否成功

        打开GNUstep->Shell(windows XP下方法是开始---所有程序---GNUstep---Shell),输入make -v 和 gcc -v命令,如图所示

           

 

        出现了相应的版本号说明安装成功。


3、下载安装NDK

         下载NDK,地址http://developer.android.com/tools/sdk/ndk/index.html。下载完后解压即可。

         我是把NDK和GNUstep放在同一个目录下,如图:在F盘的soft文件夹下

           

4、配置NDK的环境变量

          由于GNUstep是模拟linux的,所以路径和windows下不同,可以在GNUstep下运行命令mount:查看对应的盘符在GNUstep下的表示:如下图

          


          可见:F盘对应的是(/f),所以在GNUstep下NDK的路径是/f/soft/android-ndk-r9c

         配置步骤:依次打开F盘---soft---GNUstep---GNUstep---GNUstep.conf(记事本打开),

        在最后面加上如下的代码:

       

NDK=/f/soft/android-ndk-r9c

export=NDK

5、验证环境配置是否正确(在此之前关掉此终端,重新打开终端 )

       如下,运行(cd $NDK),看是否能切换到制定的路径,能则表示配置成功:

      


到此环境就配置成功啦 !!!


下面是一个简单的运用例子:

1、在Eclipse下创建一个新的Android应用,JniDemo。

          第一个类CalUtils.java(表示一个计算类)

package com.hasen.jnidemo;

public class CalUtils {
	static {
		System.loadLibrary("hasenJni"); 
	}
	public native int add(int numA ,int numB) ;
}

         该类中有一个本地方法,具体实现他的功能在C文件中(加法操作)。在静态代码块中加载了一个库文件(hasenJni不含后缀名),我们后面将生成(hasenJni.so文件),在此也可以先将该静态代码块注释掉,后面生成so文件之后再加上。


         第二个类MainActivity.java(主界面)

package com.hasen.jnidemo;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main); 
		CalUtils calUtils = new CalUtils() ;
		setTitle(String.valueOf(calUtils.add(10, 15))); 
	}
}

         其中会调用计算类的加法方法。

2、运行一下,可能会报错(此步骤是为了编译产生class文件),产生编译后的文件在bin目录下classes文件夹下,通过javah命令生成c/c++的文件头(h文件)

        在GNUstep终端中定位到项目的根目录下:我的是在g盘下workspace文件夹下的JniDemo中

        运行cd /g/workspace/JniDemo,然后运行如下代码生成头文件。

       

        javah是命令,-classpath 后接目录,此处表示class文件在bin文件夹下classes文件夹中,-d 后面表示生成的h文件所放的目录,最后的是包含本地方法(native关键字修饰)的类的完整包名加类名。

       运行此命令之后会在该项目中生成一个文件夹jni ,内有一个h文件(com_hasen_jnidemo_CalUtils.h)文件名大家自己领悟。注意该文件是自动生成的,不要去改动。要在Eclipse中看到增加的文件夹,选中该项目后按F5刷新一下。h文件的代码如下:


/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hasen_jnidemo_CalUtils */

#ifndef _Included_com_hasen_jnidemo_CalUtils
#define _Included_com_hasen_jnidemo_CalUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_hasen_jnidemo_CalUtils
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_hasen_jnidemo_CalUtils_add
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif


3、在jni文件夹下创建一个C或者cpp文件,此处我用的c文件(com_hasen_jnidemo_CalUtils.c)。文件名和h文件保持一致。编辑实现加法(add)方法

    #include <stdlib.h>
	#include <jni.h>
    #include "com_hasen_jnidemo_CalUtils.h"

    JNIEXPORT jint JNICALL Java_com_hasen_jnidemo_CalUtils_add(JNIEnv * env, jobject c, jint a, jint b)

    {

       return (a+b);

    }

4、接下来编写 Android.mk,也创建在jni文件夹下,该文件可以直接从NDK的samples下的hello-jni的jni文件下直接靠过来改改就可以了。

         

其中你只需要该LOCAL_MODULE和LOCAL_SRC_FILES就可以了。

说明:LOCAL_MODULE是描述模块的,用来给java调用的模块名,会生成对应的hasenJni.so(java代码中加载的库名)

LOCAL_SRC_FILES就是源文件啦,多个文件空格隔开即可。

# Copyright (C) 2009 The Android Open Source Project   
#   
# Licensed under the Apache License, Version 2.0 (the "License");   
# you may not use this file except in compliance with the License.   
# You may obtain a copy of the License at   
#   
#      http://www.apache.org/licenses/LICENSE-2.0   
#   
# Unless required by applicable law or agreed to in writing, software   
# distributed under the License is distributed on an "AS IS" BASIS,   
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   
# See the License for the specific language governing permissions and   
# limitations under the License.   
#   
LOCAL_PATH := $(call my-dir)   
         
include $(CLEAR_VARS)   
         
LOCAL_MODULE    := hasenJni   
LOCAL_SRC_FILES := com_hasen_jnidemo_CalUtils.c   
         
include $(BUILD_SHARED_LIBRARY)


目录结构粘一下,方便大家看在哪里创建的这些文件


       


5、接下来生成so文件。

        打开gnustep的命令窗口,进入到项目根目录(cd /g/workspace/JniDemo)下,输入$NDK/ndk-build命令,即可自动生成libs/armeabi/hasenJni.so文件

       

        没看到,刷新一下项目,看看有没有,看上面的目录结构图,hasenJni.so出现在lib文件夹下的armeabi文件夹下。


这样就完成了,运行一下项目(取消静态代码块的注释),是不是可以正常运行了。


感谢大家耐心的查看!!


DEMO代码免费分享给大家

http://download.csdn.net/download/u011430511/6869575

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值