.examples improved Android builder example

git-svn-id: svn://ultimatepp.org/upp/trunk@8659 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
klugier 2015-07-09 20:12:31 +00:00
parent 1a7978c094
commit 2dc6459f34
7 changed files with 150 additions and 80 deletions

View file

@ -4,12 +4,12 @@ public class AndroidMath
{
private AndroidMath() {}
// Native stuff - C/C++
public static native int power(int number, int n);
static {
// In this place we are loading native libraries.
// Native library always has upp package name!
System.loadLibrary("AndroidMath");
}
// Native stuff - C/C++
public static native int power(int number, int n);
static {
// In this place we are loading native libraries.
// Native library always has upp package name!
System.loadLibrary("AndroidMath");
}
}

View file

@ -7,42 +7,56 @@ import android.os.Bundle;
public class AndroidMathActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
calculatePowerOperations(tv, 20);
calculateVectorOperations(tv);
scroller.addView(tv);
setContentView(scroller);
}
calculatePowerOperations(tv, 20);
calculateVectorOperations(tv);
scroller.addView(tv);
setContentView(scroller);
}
private void calculatePowerOperations(TextView tv, int maxPower)
{
String text = "Power:\n";
int maxNumber = maxPower;
for(int i = 1; i <= maxNumber; i++) {
int pow = AndroidMath.power(i, 2);
text += Integer.toString(i) + "^2 = " + Integer.toString(pow) + "\n";
}
tv.append(text);
}
private void calculateVectorOperations(TextView tv)
{
String text = "Vector operations:\n";
Vector vec1 = new Vector(3);
text += "Vec1 Size: " + Integer.toString(vec1.getSize()) + "\n";
text += "Vec1: " + vec1.toString() + "\n";
tv.append(text);
}
private void calculatePowerOperations(TextView tv, int maxPower)
{
String text = "Power:\n";
int maxNumber = maxPower;
for(int i = 1; i <= maxNumber; i++) {
int pow = AndroidMath.power(i, 2);
text += Integer.toString(i) + "^2 = " + Integer.toString(pow) + "\n";
}
tv.append(text);
}
private void calculateVectorOperations(TextView tv)
{
String text = "Vector operations:\n";
Vector vec1 = new Vector(3);
vec1.set(0, 3.0f);
vec1.set(1, -1.0f);
vec1.set(2, 5.0f);
text += "Vec1: " + vec1.toString() + "\n";
Vector vec1Copy = new Vector(vec1);
vec1Copy.multipleByScalar(5.0f);
text += "3 * Vec1: " + vec1Copy.toString() + "\n";
Vector vec2 = new Vector(4);
vec2.set(0, -2.0f);
vec2.set(1, 4.0f);
vec2.set(2, 7.0f);
vec2.set(3, -9.0f);
text += "Vec2: " + vec2.toString() + "\n";
tv.append(text);
}
}

View file

@ -2,30 +2,36 @@
#define _JniMath_MemoryManager_h_
#include <jni.h>
#include <string>
#include <sstream>
#include <vector>
/**
* Java "HashCode()" object memory manager.
* Java simply memory manager.
*/
template <class T>
class MemoryManager {
public:
void Insert(JNIEnv *env, jobject jobj, const T& obj)
{
std::string hashCode = GetJobjectHasCode(env, jobj);
if(!hashCode.empty()) {
hashCodes.push_back(hashCode);
jobject weakGlobalRef = env->NewWeakGlobalRef(jobj);
if(!env->IsSameObject(weakGlobalRef, NULL)) {
objs.push_back(env->NewWeakGlobalRef(weakGlobalRef));
values.push_back(obj);
}
}
void MakeCopy(JNIEnv *env, jobject jobjSrc, jobject jobjDst)
{
if(!env->IsSameObject(jobjSrc, jobjDst)) {
T t(*Get(env, jobjSrc));
Insert(env, jobjSrc, t);
}
}
void Erase(JNIEnv *env, jobject jobj)
{
int idx = FindIdx(env, jobj);
if(idx >= 0) {
hashCodes.erase(hashCodes.begin() + idx);
objs.erase(objs.begin() + idx);
values.erase(values.begin() + idx);
}
}
@ -33,38 +39,27 @@ public:
T* Get(JNIEnv *env, jobject jobj)
{
int idx = FindIdx(env, jobj);
return idx != -1 ? &values[idx] : NULL;
return idx >= 0 ? &values[idx] : NULL;
}
int GetCount()
{
return static_cast<int>(values.size());
}
private:
int FindIdx(JNIEnv *env, jobject jobj)
{
std::string hashCode = GetJobjectHasCode(env, jobj);
for(int i = 0; i < hashCodes.size(); i++) {
if(hashCode == hashCodes[i]) {
for(int i = 0; i < objs.size(); i++) {
if(env->IsSameObject(objs[i], jobj)) {
return i;
}
}
return -1;
}
std::string GetJobjectHasCode(JNIEnv *env, jobject jobj)
{
jclass cls = env->GetObjectClass(jobj);
jmethodID mid = env->GetMethodID(cls, "hashCode", "()I");
if(mid == 0) {
return "";
}
int ret = env->CallIntMethod(jobj, mid);
std::stringstream ss;
ss << ret;
return ss.str();
return 0;
}
private:
std::vector<std::string> hashCodes;
std::vector<jobject> objs;
std::vector<T> values;
};

View file

@ -30,6 +30,17 @@ JNIEXPORT void JNICALL Java_org_upp_AndroidMath_Vector_construct
mm.Insert(env, obj, Vector(size));
}
/*
* Class: org_upp_AndroidMath_Vector
* Method: copyConstruct
* Signature: (Lorg/upp/AndroidMath/Vector;)V
*/
JNIEXPORT void JNICALL Java_org_upp_AndroidMath_Vector_copyConstruct
(JNIEnv *env, jobject objSrc, jobject objDst)
{
mm.MakeCopy(env, objSrc, objDst);
}
/*
* Class: org_upp_AndroidMath_Vector
* Method: destruct
@ -60,9 +71,11 @@ JNIEXPORT jint JNICALL Java_org_upp_AndroidMath_Vector_getSize
* Signature: (I)F
*/
JNIEXPORT jfloat JNICALL Java_org_upp_AndroidMath_Vector_get
(JNIEnv *, jobject, jint)
(JNIEnv *env, jobject obj, jint id)
{
return 0.0f;
Vector* vec = mm.Get(env, obj);
return vec->Get(id);
}
/*
@ -71,9 +84,22 @@ JNIEXPORT jfloat JNICALL Java_org_upp_AndroidMath_Vector_get
* Signature: (IF)V
*/
JNIEXPORT void JNICALL Java_org_upp_AndroidMath_Vector_set
(JNIEnv *, jobject, jint, jfloat)
(JNIEnv *env, jobject obj, jint id, jfloat value)
{
Vector* vec = mm.Get(env, obj);
vec->Set(id, value);
}
/*
* Class: org_upp_AndroidMath_Vector
* Method: multipleByScalar
* Signature: (F)V
*/
JNIEXPORT void JNICALL Java_org_upp_AndroidMath_Vector_multipleByScalar
(JNIEnv *env, jobject obj, jfloat scalar)
{
Vector* vec = mm.Get(env, obj);
vec->MultipleByScalar(scalar);
}
/*
@ -86,7 +112,7 @@ JNIEXPORT jstring JNICALL Java_org_upp_AndroidMath_Vector_toString
{
Vector* vec = mm.Get(env, obj);
return env->NewStringUTF(vec->ToString().c_str());
return env->NewStringUTF((vec->ToString()).c_str());
}
#ifdef __cplusplus

View file

@ -1,7 +1,7 @@
package org.upp.AndroidMath;
/**
* Class witch whole implementaiton is native.
* Class which whole implementaiton is native.
*/
public class Vector
{
@ -10,21 +10,30 @@ public class Vector
construct(size);
}
public Vector(Vector vec)
{
copyConstruct(vec);
}
@Override
public void finalize()
protected void finalize() throws Throwable
{
destroy();
super.finalize();
}
// Native stuff - C/C++
public native int getSize();
public native float get(int id);
public native void set(int id, float data);
public native void set(int id, float value);
public native void multipleByScalar(float scalar);
public native String toString();
private native void construct(int size);
private native void copyConstruct(Vector vec);
private native void destroy();
static {

View file

@ -26,7 +26,6 @@ Vector::Vector(const Vector& vec)
for(int i = 0; i < size; i++) {
data[i] = vec.data[i];
}
}
}
@ -35,6 +34,28 @@ Vector::~Vector()
delete[] data;
}
float Vector::Get(int id) const
{
return this->data[id];
}
int Vector::GetSize() const
{
return this->size;
}
void Vector::Set(int id, float value)
{
this->data[id] = value;
}
void Vector::MultipleByScalar(float scalar)
{
for(int i = 0; i < size; i++) {
this->data[i] *= scalar;
}
}
std::string Vector::ToString() const
{
std::stringstream ss;

View file

@ -12,7 +12,12 @@ public:
Vector(const Vector& vec);
virtual ~Vector();
int GetSize() const { return this->size; }
float Get(int id) const;
int GetSize() const;
void Set(int id, float value);
void MultipleByScalar(float scalar);
std::string ToString() const;