http://www.51cto.com/specbook/17/1351.htm // 很好的入门教程
======================JNI类===========================================
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.test);
tv.setText(sayHi() + "---hell jni");
tv.setText(sayHi() + "---hell jni "
+ classLoader.getClass().getSimpleName());
String[] ss = ss();
for (int i = 0; i < ss.length; i++) {
Log.e("JULY", "==" + ss[i]);
}
}
/**返回int*/
public native int sayHi();
/**返回String字符串*/
public native String[] ss();
static {
System.loadLibrary("test"); // 加载的so的名字
}
}
================================Android.mk=================================
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test // 这个就是编译产生的so文件,与上面的一一对应
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)
=================================test.cpp===================================
#include <jni.h>
#include <string.h>
extern "C" {
jint Java_com_jnitest_MainActivity_sayHi(JNIEnv *env, jobject thiz) {
return 100;
}
// Java.包名.类名(有native方法的类).该类的方法名 .替换成_ 比如 Java.com.jnitest.MainActivity.ss
// 替换后 Java_com_jnitest_MainActivity_ss (MainActivity.ss 函数对应)
// (JNIEnv *env, jobject thiz) 这两个参数是规定不能少的,为什么,我也解释不了,记住即可
jobjectArray Java_com_jnitest_MainActivity_ss(JNIEnv *env, jobject thiz) {
//android/content/ContextWrapper
jclass cl = env->FindClass("java/lang/String");
jobjectArray s = env->NewObjectArray(5,cl,NULL);
env->SetObjectArrayElement(s,0,env->NewStringUTF("1"));
env->SetObjectArrayElement(s,1,env->NewStringUTF("2"));
env->SetObjectArrayElement(s,2,env->NewStringUTF("3"));
env->SetObjectArrayElement(s,3,env->NewStringUTF("4"));
env->SetObjectArrayElement(s,4,env->NewStringUTF("5"));
return s;
}
}