Jni 普通java类,该类构造两个本地方法:
1 package com.jni.jni; 2 3 public class Jni { 4 public static native String stTst(); 5 static{ 6 System.loadLibrary("JNI"); 7 } 8 public native String tst(); 9 }
显示Jni调用结果的Activity
package com.jni.jni; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { private TextView test; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); test = (TextView) findViewById(R.id.tst); String stTst = Jni.stTst(); Jni j = new Jni(); test.setText("静态方法:" + stTst + "\n非静态方法:" + j.tst()); } }
jni代码如下:
1 #include <jni.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include "mlog.h" 5 // 定义c方法:对应java的 stTst(); 6 //extern "C" void staticTst(JNIEnv* env, jobject thiz); 7 extern "C" jstring statTst(JNIEnv* env, jobject thiz); 8 extern "C" jstring tst(JNIEnv* env, jobject thiz); 9 //(void*) 指针 10 JNINativeMethod metheds[] = { 11 // java方法名,函数签名(参数列表)-返回值,java映射成C世界的方法 12 { "stTst", "()Ljava/lang/String;", (void*) statTst }, { "tst", 13 "()Ljava/lang/String;", (void*) tst } }; 14 jstring statTst(JNIEnv* env, jobject thiz) { 15 return env->NewStringUTF("静态方法返回的string"); 16 } 17 jstring tst(JNIEnv* env, jobject thiz) { 18 return env->NewStringUTF("非静态方法返回的string"); 19 } 20 jint JNI_OnLoad(JavaVM* vm, void* reserved) { 21 jint result = JNI_ERR; 22 JNIEnv* env = NULL; 23 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 24 LOGE("-------4---------"); 25 return result; 26 } 27 jclass clazz = env->FindClass("com/jni/jni/Jni"); 28 if (clazz == NULL) { 29 LOGE("-------1---------"); 30 return result; 31 } 32 if (env->RegisterNatives(clazz, metheds, 33 sizeof(metheds) / sizeof(metheds[0])) < 0) { 34 LOGE("-------2---------"); 35 return result; 36 } 37 result = JNI_VERSION_1_4; 38 LOGE("-------3=ok---------"); 39 return result; 40 }
log构造:
#ifndef _MYLOG_H #define _MYLOG_H #include <android/log.h> #define TAG "JULY" #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG, __VA_ARGS__) #endif
Android.mk构造:
1 LOCAL_PATH := $(call my-dir) 2 3 include $(CLEAR_VARS) 4 LOCAL_LDLIBS := -lm -llog -landroid // android log 添加该配置: 5 LOCAL_MODULE := JNI 6 LOCAL_SRC_FILES := JNI.cpp 7 8 include $(BUILD_SHARED_LIBRARY)
保持专注可好