mainActivity如下:
package c.c; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; import android.app.Activity; /** * JNI的HelloWorld示例 * 1 下载和安装cygwin.重要参考资料: * http://www.cnblogs.com/playing/archive/2011/07/14/2106727.html * 注意make组件的安装,该步骤没有截图,但和binutils,gcc,gcc-mingw,gdb * 是很类似的 * 2 检查cygwin是否安装正确 * 通过命令行进入cygwin 输入cd $NDKROOT,若输出bash_profile中于ndk * 配置相关的一行信息则表示安装成功. * 注意这里的输入的命令是cd $NDKROOT,所以bash_profile文件中配置的 * 名称也应是NDKROOT.即两者保持一致 * 3 编译 * 3.1 进入cygwin,然后cd,然后空格,然后拖入android工程的完成路径. * 例如:$ cd /cygdrive/d/workplace/JNITest * 3.2 再执行命令$ $NDKROOT/ndk-build -B * 即可生成.so文件 * * 编写与JNI有关的HelloWorld的小例子,参考资料: * http://blog.csdn.net/zhangjie201412/article/details/7297899 * 注意的问题: * 1 JNI函数的名称格式 * Java_完整的Activity路径_方法名 * 比如此处: * jstring Java_c_c_MainActivity_getString(JNIEnv *env,jobject jobj) * 该问题在上面的网址中也有提及,要尤其注意 * 2 利用 System.loadLibrary()载入原生库时 * 参数为.c文件的名称,比如: * System.loadLibrary("HelloWorld") */ public class MainActivity extends Activity { private Button mButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init(){ mButton=(Button) findViewById(R.id.button); mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { String result=getString(); Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show(); } }); } //声明JNI函数函数 public native String getString(); //载入原生库 static { System.loadLibrary("HelloWorld"); } }
HelloWorld.c如下:
//HelloWorld.c #include <string.h> #include <jni.h> jstring Java_c_c_MainActivity_getString(JNIEnv *env,jobject jobj) { return (*env)->NewStringUTF(env,"HelloWorld,JNI is good"); }
Android.mk如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := HelloWorld LOCAL_SRC_FILES := HelloWorld.c LOCAL_LDLIBS += -llog -ldl include $(BUILD_SHARED_LIBRARY)
Application.mk.mk如下:
APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi-v7a
main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="hello JNI" /> </RelativeLayout>