windows环境 andorid JNI开发

1.下载并安装GNUstep

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

     安装文件

        a.GNUstep MSYS System

        b.GNUstep Core

        c.GNUstep Devel

      安装以上文件最新版本,都默认安装在同一个目录.

     安装完成后,进入GNUstep菜单,选择shell,进入一个linux的命令界面,输入gcc -v ,如果显示一下gcc的版本信息,安装成功了.我安装的时候,没有安装GNUstep Deve,导致没有正确显示命令      结果,所以这个三个文件是必须安装的

 2.在eclipse新建一个android程序.

   

   在HelloJni Activity中:

   

/**
 * 
 */
package com.hello.jni;

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

/**
 * @author Johnson
 * TODO
 * 2013-11-25下午4:13:00
 */
public class HelloJni extends Activity {

    /**
     * 
     */
    public HelloJni() {
        // TODO Auto-generated constructor stub
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        String hello = sayHello("johnson");
        TextView tv = (TextView) findViewById(R.id.showtext);
        tv.setText(hello);
    }

    public native String sayHello(String name);
    static{
        System.loadLibrary("HelloJNI");
    }

}

3.生成com_hello_jni_HelloJni.h文件

   在windows命令行下,进入到项目地址/bin/classes目录下

   执行 javah com.hello.jni.HelloJni    

   生成的com_hello_jni_HelloJni.h

   

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

#ifndef _Included_com_hello_jni_HelloJni
#define _Included_com_hello_jni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_hello_jni_HelloJni
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hello_jni_HelloJni_sayHello
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

 

    javah 包路径.调用JNI的Activity类的名称.  在之前先build项目,生成classes文件.

4.编写com_hello_jni_HelloJni.c文件

  将生成的com_hello_jni_HelloJni.h文件移动到jni文件夹下,在jni文件夹下创建com_hello_jni_HelloJni.c文件

  

#include <string.h>
#include <com_hello_jni_HelloJni.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_hello_jni_HelloJni_sayHello( JNIEnv* env,jobject thiz, jstring inputstr )
{
   return (*env)->NewStringUTF(env, "Hello from JNI !");
}

 可以直接将com_hello_jni_HelloJni.h中的接口,拷贝到com_hello_jni_HelloJni.c中来,添加上参数,创建方法体.

 方法名称和参数要和com_hello_jni_HelloJni.h中的一致.

5.编写Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloJNI
LOCAL_SRC_FILES := com_hello_jni_HelloJni.c

include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE  改成自己项目名称
LOCAL_SRC_FILES 改成自己c文件的名称

6.生成.so文件
进入GNUsetp shell
进入到项目的jni目录下
执行 ndk安装路径/ndk-build

成功生成libs/armeabi/libHelloJNI.so
如果生成失败,请仔细查看日志,一般是
com_hello_jni_HelloJni.c参数问题,或者方法体内问题.

7.启动项目
如果是报loadLibrary,请检查 System.loadLibrary("HelloJNI");里面调用的名称是否与libHelloJNI.so对应.调用名称为HelloJNI,lib是系统默认的前缀.不用写.


posted @ 2013-11-27 11:18  散散客  阅读(321)  评论(0编辑  收藏  举报