昨天开通了博客园,记录我的学习生活.
今天又练习了一下Android用Jni调本地的c程序.将内容整理如下
1.新建工程,建立一个Activity,将有关Activity的代码全部注释起来,只留下native方法的申明.这一步的原因是,在生成java方法的c(c++)方法签名的时候避免一些包的缺少错误.
package com.jon.jnitest;
/*
import android.app.Activity;
import android.os.Bundle;
*/
/**
* Jni测试
* @author LJH
*
*/
public class JniTestActivity
//extends Activity
{
/** Called when the activity is first created. */
/*
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("加法8+2="+add(8, 2));
System.out.println("减法8-2="+sub(8,2));
System.out.println("乘法8*2="+mul(8,2));
System.out.println("除法8/2="+div(8, 2));
System.out.println(sayHello());
}
static{
System.loadLibrary("testjni");
}
*/
public native int add(int a, int b);
public native int sub(int a, int b);
public native int mul(int a, int b);
public native int div(int a, int b);
public native String sayHello();
}
将生成的.class文件拷到bin\classes下覆盖原来的.class文件.
此时会在src目录生成一个.h的头文件,改成.c或.cpp的文件,实现里面的方法.
4.用c或c++实现申明的方法.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jon_jnitest_JniTestActivity */
#ifndef _Included_com_jon_jnitest_JniTestActivity
#define _Included_com_jon_jnitest_JniTestActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jon_jnitest_JniTestActivity
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_jon_jnitest_JniTestActivity_add
(JNIEnv * env, jobject obj, jint a, jint b)
{
return a+b;
}
/*
* Class: com_jon_jnitest_JniTestActivity
* Method: sub
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_jon_jnitest_JniTestActivity_sub
(JNIEnv * env, jobject obj, jint a, jint b)
{
return a-b;
}
/*
* Class: com_jon_jnitest_JniTestActivity
* Method: mul
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_jon_jnitest_JniTestActivity_mul
(JNIEnv * env, jobject obj, jint a, jint b)
{
return a*b;
}
/*
* Class: com_jon_jnitest_JniTestActivity
* Method: div
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_jon_jnitest_JniTestActivity_div
(JNIEnv * env, jobject obj, jint a, jint b)
{
return a/b;
}
/*
* Class: com_jon_jnitest_JniTestActivity
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_jon_jnitest_JniTestActivity_sayHello
(JNIEnv * env, jobject obj)
{
jstring jstr ;
char cstr[] = "Welcome to the world of Jni!";
jstr = env->NewStringUTF(cstr);
return jstr;
}
#ifdef __cplusplus
}
#endif
#endif
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testjni
LOCAL_SRC_FILES := com_jon_jnitest_JniTestActivity.cpp
include $(BUILD_SHARED_LIBRARY)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("加法8+2=" + add(8, 2));
System.out.println("减法8-2=" + sub(8, 2));
System.out.println("乘法8*2=" + mul(8, 2));
System.out.println("除法8/2=" + div(8, 2));
System.out.println(sayHello());
}
static {
System.loadLibrary("testjni");
}
jstr = (*env)->NewStringUTF(cstr);
真是另人纠结,最后改成.cpp文件才对了.
第一次写,如果有不对的地方欢迎大家指点.共同进步,先谢过了哈!
记录点滴...