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是系统默认的前缀.不用写.