Android Jni 学习实战之(一)

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


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

package com.howfun.android.antguide.hf2d_jni;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class hf2d extends Activity{
   
   public void onCreate(Bundle savedInstanceState) {
      Log.d("jni", "oncreate()");
      super.onCreate(savedInstanceState);

      /*
       * Create a TextView and set its content. the text is retrieved by calling
       * a native function.
       */
      TextView tv = new TextView(this);
      tv.setText(stringFromJNI());
      setContentView(tv);
   }
   
   public native String stringFromJNI() ;

   static {
      System.loadLibrary("hf2d");
   }
}


重要的是这句:

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如下:

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

JNIEXPORT jstring JNICALL Java_com_howfun_android_antguide_hf2d_1jni_hf2d_stringFromJNI
  (JNIEnv *env, jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
三, 写Android.mk文件,放在$MYPROJECT/jni/, 如下 :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hf2d 
LOCAL_SRC_FILES := hf2d.c

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文件

在第一步中,调用:


static {
      System.loadLibrary("hf2d");
   }
加载动态库,注意去掉前面"lib"字样。


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


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

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

结果生成这个样子:

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



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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值