Android Jni学习笔记
昨天开通了博客园,记录我的学习生活.
今天又练习了一下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文件才对了.
第一次写,如果有不对的地方欢迎大家指点.共同进步,先谢过了哈!
记录点滴...