Android Jni 学习实战之(一)

http://blog.csdn.net/herbert5069/article/details/7048037

最近学习JNI,边学边做,把游戏“蚂蚁迷呀”的2D引擎改成JNI的,封装代码,同时提高运行速度。

初步探索步骤如下:一, 写Java 文件,确定JNI接口名:

[java] 
view plain
copy
print
?

  1. package com.howfun.android.antguide.hf2d_jni;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.util.Log;  
  5. import android.widget.TextView;  
  6.   
  7. public class hf2d extends Activity{  
  8.      
  9.    public void onCreate(Bundle savedInstanceState) {  
  10.       Log.d(“jni”“oncreate()”);  
  11.       super.onCreate(savedInstanceState);  
  12.   
  13.       /* 
  14.        * Create a TextView and set its content. the text is retrieved by calling 
  15.        * a native function. 
  16.        */  
  17.       TextView tv = new TextView(this);  
  18.       tv.setText(stringFromJNI());  
  19.       setContentView(tv);  
  20.    }  
  21.      
  22.    public native String stringFromJNI() ;  
  23.   
  24.    static {  
  25.       System.loadLibrary(“hf2d”);  
  26.    }  
  27. }  

重要的是这句:

[java] 
view plain
copy
print
?

  1. public native String stringFromJNI() ;  

确定接口。

二,编译工程,生成hf2d.class,到$MYPROJECT/bin/下,($MYPROJECT指我的Android工程目录),运行:

$javah -jni com.howfun.android.antguide.hf2d_jni.hf2d

在当前目录生成 hf2d.h, 注意目录不要跑过了,在bin/下即可。

考hf2d.h到$MYPROJECT/jni/ (新建这个jni目录),写hf2d.c如下:

[cpp] 
view plain
copy
print
?

  1. #include <string.h>  
  2. #include <jni.h>  
  3. #include “hf2d.h”  
  4.   
  5. JNIEXPORT jstring JNICALL Java_com_howfun_android_antguide_hf2d_1jni_hf2d_stringFromJNI  
  6.   (JNIEnv *env, jobject thiz)  
  7. {  
  8.     return (*env)->NewStringUTF(env, “Hello from JNI !”);  
  9. }  

三, 写Android.mk文件,放在$MYPROJECT/jni/, 如下 :

[cpp] 
view plain
copy
print
?

  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := hf2d   
  6. LOCAL_SRC_FILES := hf2d.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  

具体各标号啥意思本人参考:$NDK/android-ndk-r4b/docs/ANDROID-MK.TXT,很详细。

四,下载android NDK包(我用的R4版),

$export NDK=my/ndk/path

$cd $NDK/android-ndk-r4b/, 

 $export NDK_PROJECT_PATH=”~/workspace/AntGuide”

$./ndk-build

这里会生成俺想要的libhf2d.so文件

在第一步中,调用:

[java] 
view plain
copy
print
?

  1. static {  
  2.       System.loadLibrary(“hf2d”);  
  3.    }  

加载动态库,注意去掉前面”lib”字样。

运行APK,会显示来自远方JNI的问候。

特别友情提示:不要在类路径里用下划线,不然需要在函数名的下划线后加“1“,如同我的反面典型:

包名:package com.howfun.android.antguide.hf2d_jni;

结果生成这个样子:

[cpp] 
view plain
copy
print
?

  1. Java_com_howfun_android_antguide_hf2d_1jni_hf2d_stringFromJN  
  2. 多了个“1“, FT。。。  

本小章完。待续:hf2d java引擎移植到jni

点赞