您的位置:首页 > 其它

JNI简单示例

2016-07-08 17:58 405 查看
Jni 普通java类,该类构造两个本地方法:

package com.jni.jni;

public class Jni {
public static native String stTst();
static{
System.loadLibrary("JNI");
}
public native String tst();
}


显示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代码如下:

#include <jni.h>
#include <stdio.h>
#include <string.h>
#include "mlog.h"
// 定义c方法:对应java的 stTst();
//extern "C" void staticTst(JNIEnv* env, jobject thiz);
extern "C" jstring statTst(JNIEnv* env, jobject thiz);
extern "C" jstring tst(JNIEnv* env, jobject thiz);
//(void*) 指针
JNINativeMethod metheds[] = {
// java方法名,函数签名(参数列表)-返回值,java映射成C世界的方法
{ "stTst", "()Ljava/lang/String;", (void*) statTst }, { "tst",
"()Ljava/lang/String;", (void*) tst } };
jstring statTst(JNIEnv* env, jobject thiz) {
return env->NewStringUTF("静态方法返回的string");
}
jstring tst(JNIEnv* env, jobject thiz) {
return env->NewStringUTF("非静态方法返回的string");
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
jint result = JNI_ERR;
JNIEnv* env = NULL;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("-------4---------");
return result;
}
jclass clazz = env->FindClass("com/jni/jni/Jni");
if (clazz == NULL) {
LOGE("-------1---------");
return result;
}
if (env->RegisterNatives(clazz, metheds,
sizeof(metheds) / sizeof(metheds[0])) < 0) {
LOGE("-------2---------");
return result;
}
result = JNI_VERSION_1_4;
LOGE("-------3=ok---------");
return result;
}


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构造:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_LDLIBS    := -lm -llog -landroid // android log 添加该配置:
LOCAL_MODULE    := JNI
LOCAL_SRC_FILES := JNI.cpp

include $(BUILD_SHARED_LIBRARY)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: