1. 启动Elipse,菜单: File->New->Android Project: Project name : JniTest Build Target : Android 2.2 Package name : jni.PN Create Activeity : JniCA->Finish
2. 修改main.xml,<TextView>元素增加属性 android:id="@+id/JNITest"
3.修改JniCA.java为:package jni.PN;
import android.app.Activity;import android.os.Bundle;import android.widget.TextView;
public class JniCA extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String str = GetTest(); TextView JNITest = (TextView)findViewById(R.id.JNITest); JNITest.setText(str); } static { System.loadLibrary("JNITest"); } public native String GetTest();}
4.根据上面工程class文件,然后用javah工具生成c/c++头文件.命令为: javah -classpath bin -d csrc jni.PN.JniCA a)确保javah.exe所在的目录已经加入了系统PATH变量中 b)打开cmd.exe控制台,进入本工程所在的目录下,本机为:E:/WorkSpace/android/androidworkspace/JniTest
5.在工程目录的csrc目录下,建jni_PN_JniCA.cpp文件,内容如下:
#include "jni_PN_JniCA.h"
JNIEXPORT jstring JNICALL Java_jni_PN_JniCA_GetTest(JNIEnv *env, jobject){ return env->NewStringUTF((char*)"JNITest Native String");}
6.在工程目录的scrc目录下,建make文件,内容如下:(其中自己修改BINPATH, SRCPATH, CC, CPP的值)
################ Project Definition ################
TARGET=JniTestPLATFORM=ANDROIDSRCPATH=.BINPATH=../cbinINCPATH=..LIBPATH=.
INCPATH1=.INCPATH2=.INCPATH3=.
################ Build Specification ################
CC=/cygdrive/e/WorkSpace/android/toolchain/bin/arm-linux-androideabi-gccCPPC=/cygdrive/e/WorkSpace/android/toolchain/bin/arm-linux-androideabi-g++LK=$(CPPC)
CCFLAG=-Wall -c -D "_LINUX" -D "$(PLATFORM)" -D "ENABLE_SPEED_TEST" -D "CGT_FACE_LIB"LDFLAG=-lm -fPIC -shared -Wl,-s
INC=-I"$(SRCPATH)" -I"$(INCPATH)" -I"$(INCPATH1)" -I"$(INCPATH2)" -I"$(INCPATH3)"DBGFLAG=$(CCFLAG) -D "_DEBUG" $(INC) RLSFLAG=$(CCFLAG) -D "NDEBUG" $(INC) -O2
################ Process Sript ################
SRC1=$(wildcard $(SRCPATH)/*.c)SRC2=$(wildcard $(SRCPATH)/*.cpp)OBJ1=$(SRC1:.c=.o)OBJ2=$(SRC2:.cpp=.o)LIB=$(wildcard $(LIBPATH)/*.a)
DBGPATH:=$(BINPATH)/DebugRLSPATH:=$(BINPATH)DBGTARGET:=$(DBGPATH)/lib$(TARGET).soRLSTARGET:=$(RLSPATH)/lib$(TARGET).soDBGOBJ1:=$(addprefix ./Debug/, $(notdir $(OBJ1)))DBGOBJ2:=$(addprefix ./Debug/, $(notdir $(OBJ2)))RLSOBJ1:=$(addprefix ./Release/, $(notdir $(OBJ1)))RLSOBJ2:=$(addprefix ./Release/, $(notdir $(OBJ2)))DBGLIB:=$(filter %_d.a, $(LIB))RLSLIB:=$(filter-out %_d.a, $(LIB))
.PHONY : all dbg rls dbgcln rlscln clean dbgpre rlspreall : rls
clean: dbgcln rlscln
dbg: dbgpre dbgcln $(DBGTARGET)
rls: rlspre rlscln $(RLSTARGET)
dbgcln: @echo "Clean for $(TARGET) - $(PLATFORM) Debug" @rm -f $(DBGTARGET) @rm -f $(DBGOBJ1) @rm -f $(DBGOBJ2)
rlscln: @echo "Clean for $(TARGET) - $(PLATFORM) Release" @rm -f $(RLSTARGET) @rm -f $(RLSOBJ1) @rm -f $(RLSOBJ2) dbgpre: @echo "" @echo "---------------- Building: $(TARGET) - $(PLATFORM) Debug ----------------" @echo "" @mkdir -p ./Debug @mkdir -p $(DBGPATH) rlspre: @echo "" @echo "---------------- Building: $(TARGET) - $(PLATFORM) Release ----------------" @echo "" @mkdir -p ./Release @mkdir -p $(RLSPATH)
$(DBGTARGET) : $(DBGOBJ1) $(DBGOBJ2) $(DBGLIB) @echo "Linking $(DBGTARGET)" @$(LK) $(LDFLAG) -o $(DBGTARGET) $(DBGOBJ1) $(DBGOBJ2) $(DBGLIB) $(DBGOBJ1) : ./Debug/%.o : $(SRCPATH)/%.c @echo "C Compiling $<" @$(CC) $(DBGFLAG) -o $@ $< $(DBGOBJ2) : ./Debug/%.o : $(SRCPATH)/%.cpp @echo "C++ Compiling $<" @$(CPPC) $(DBGFLAG) -o $@ $< $(RLSTARGET) : $(RLSOBJ1) $(RLSOBJ2) $(RLSLIB) @echo "Linking $(RLSTARGET)" @$(LK) $(LDFLAG) -o $(RLSTARGET) $(RLSOBJ1) $(RLSOBJ2) $(RLSLIB)
$(RLSOBJ1) : ./Release/%.o : $(SRCPATH)/%.c @echo "C Compiling $<" @$(CC) $(RLSFLAG) -o $@ $<
$(RLSOBJ2) : ./Release/%.o : $(SRCPATH)/%.cpp @echo "C++ Compiling $<" @$(CPPC) $(RLSFLAG) -o $@ $<
7.启动CygWin,进入本工程目录下的csrc目录下,执行命令: make,在cbin下面得到libJniTest.so
8.把android sdk目录下的adb.exe所在的路径加入系统PATH,本机路径为"E:/WorkSpace/android/android-sdk-windows/platform-tools"
9.新建模拟器(名字:and),调用下面命令启动模拟器android-sdk-windows/tools>emulator.exe -avd and -partition-size 128
10.cmd下启动程序adb.exe,进入程序目录的cbin目录下,运行命令行:adb remountadb push libJniTest.so /system/lib
11.在elipse环境中运行程序,可以看到效果.
//另:so文件的打包方法: 可以把so文件们拷贝到本工程目录下的"lib"->"armeabi"目录下,在elipse下的package explorer下如果没有该目录则按F5刷新.这样编辑得到的apk文件就自动包含so了.