android : jave调用native c++

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=JniTest
PLATFORM=ANDROID
SRCPATH=.
BINPATH=../cbin
INCPATH=..
LIBPATH=.

INCPATH1=.
INCPATH2=.
INCPATH3=.

################ Build Specification ################

CC=/cygdrive/e/WorkSpace/android/toolchain/bin/arm-linux-androideabi-gcc
CPPC=/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)/Debug
RLSPATH:=$(BINPATH)
DBGTARGET:=$(DBGPATH)/lib$(TARGET).so
RLSTARGET:=$(RLSPATH)/lib$(TARGET).so
DBGOBJ1:=$(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 rlspre
all : 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 remount
adb push libJniTest.so /system/lib

11.在elipse环境中运行程序,可以看到效果.

//
另:so文件的打包方法: 可以把so文件们拷贝到本工程目录下的"lib"->"armeabi"目录下,在elipse下的package explorer下如果没有该目录则按F5刷新.这样编辑得到的apk文件就自动包含so了.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值