java调用so方法如何返回对象

Python018

java调用so方法如何返回对象,第1张

虽然Java 严格按照值传递,但是精确的效果在传递基本类型还是引用类型之间是不同的。

当我们将一个原始类型传递给一个方法时,它将按值传递。但是当我们将一个对象传递给一个方法时,情况会发生巨大的变化,因为对象是通过有效调用的方式传递的。Java做这个有趣的事情,这是一种混合传递值和传递引用。基本上,函数不能更改参数,但函数可以通过调用其中的某些方法来让参数自行更改。

在创建类类型的变量时,我们只创建一个对象的引用。因此,当我们将此引用传递给方法时,接收它的参数将引用与参数引用的对象相同的对象。

这实际上意味着对象的行为就好像通过使用引用调用来传递给方法一样。

方法内部对象的改变确实反映在用作参数的对象中。

在Java中,我们可以将对象传递给方法。例如,请考虑以下程序:

// Java program to demonstrate objects

// passing to methods.

class ObjectPassDemo

{

int a, b

ObjectPassDemo(int i, int j)

{

a = i

b = j

}

// return true if o is equal to the invoking

// object notice an object is passed as an

// argument to method

boolean equalTo(ObjectPassDemo o)

{

return (o.a == a &&o.b == b)

}

}

// Driver class

public class Test

{

public static void main(String args[])

{

ObjectPassDemo ob1 = new ObjectPassDemo(100, 22)

ObjectPassDemo ob2 = new ObjectPassDemo(100, 22)

ObjectPassDemo ob3 = new ObjectPassDemo(-1, -1)

System.out.println("ob1 == ob2: " + ob1.equalTo(ob2))

System.out.println("ob1 == ob3: " + ob1.equalTo(ob3))

}

}

输出:

ob1 == ob2:true

ob1 == ob3:false

创建了三个对象'ob1','ob2'和'ob3':

ObjectPassDemo ob1 = new ObjectPassDemo(100,22)

ObjectPassDemo ob2 = new ObjectPassDemo(100,22)

ObjectPassDemo ob3 = new ObjectPassDemo(-1,-1)

在方法方面,声明了一个名为a的Foo类型的引用,并且它的初始值为null。

boolean equalTo(ObjectPassDemo o)

当我们调用方法equalTo时,引用'o'将被分配给作为参数传递的对象,即'o'将引用'ob2'作为以下语句执行。

System.out.println(“ob1 == ob2:”+ ob1.equalTo(ob2))

现在我们可以看到,'ob1'上调用了equalTo方法,'o'指的是'ob2'。由于'a'和'b'的值对于两个引用都是相同的,所以如果(条件)为真,那么将返回布尔值true。

if(oa == a &&ob == b)

执行以下语句时,'o'将重新分配给'ob3'。

System.out.println(“ob1 == ob3:”+ ob1.equalTo(ob3))

现在我们可以看到,'ob1'上调用了equalTo方法,'o'指的是'ob3'。由于'a'和'b'的值对于两个引用都不相同,所以如果(条件)为假,那么else块将执行并且将返回false。

定义一个将其类的对象作为参数的构造函数

对象参数最常见的用途之一是构造函数。通常,在实践中,需要构建一个新对象,以便它最初与某个现有对象相同。为此,我们可以使用Object.clone()方法或定义一个将其类的对象作为参数的构造函数。下面的例子说明了第二个选项:

// Java program to demonstrate one object to

// initialize another

class Box

{

double width, height, depth

// Notice this constructor. It takes an

// object of type Box. This constructor use

// one object to initialize another

Box(Box ob)

{

width = ob.width

height = ob.height

depth = ob.depth

}

// constructor used when all dimensions

// specified

Box(double w, double h, double d)

{

width = w

height = h

depth = d

}

// compute and return volume

double volume()

{

return width * height * depth

}

}

// driver class

public class Test

{

public static void main(String args[])

{

// creating a box with all dimensions specified

Box mybox = new Box(10, 20, 15)

// creating a copy of mybox

Box myclone = new Box(mybox)

double vol

// get volume of mybox

vol = mybox.volume()

System.out.println("Volume of mybox is " + vol)

// get volume of myclone

vol = myclone.volume()

System.out.println("Volume of myclone is " + vol)

}

}

输出:

Volume of mybox is 3000.0

Volume of myclone is 3000.0

返回对象

在java中,一个方法可以返回任何类型的数据,包括对象。例如,在以下程序中,incrByTen()方法返回一个对象,其中(整数变量)的值比调用对象中的值大10。

// Java program to demonstrate returning

// of objects

class ObjectReturnDemo

{

int a

ObjectReturnDemo(int i)

{

a = i

}

// This method returns an object

ObjectReturnDemo incrByTen()

{

ObjectReturnDemo temp =

new ObjectReturnDemo(a+10)

return temp

}

}

// Driver class

public class Test

{

public static void main(String args[])

{

ObjectReturnDemo ob1 = new ObjectReturnDemo(2)

ObjectReturnDemo ob2

ob2 = ob1.incrByTen()

System.out.println("ob1.a: " + ob1.a)

System.out.println("ob2.a: " + ob2.a)

}

}

输出:

ob1.a:2

ob2.a:12

厂家并没有欺骗你或者是含糊你的意思,确实是只提供给你jar包以及 so 库就可以了,做法是这样子的:

1.比如我现在在用net.sqlcipher.database 这个加密库(网上能搜得到的,用于数据库加密)。 那么我现在就在项目用加载这个jar包(在你的项目单击右键-》属性-》Java Build Path-》Libraries-》Add Jars,选择提供给你的jar包,我这里是 sqlcipher.jar,然后在Order and Export勾选你刚刚加载的 jar包。)

2.打开你的workspace目录,在你的项目目录下创建一个文件夹libs(如果文件夹不存在的话),然后将提供给你的so库放入该目录,基本架构就算是搭建好了。

3.进行开发,这里你需要问一下提供给你jar包的厂家,基本的用法,否则的话是无法进行开发的,因为你都不知道怎么去用。 sqlcipher的基本用法是:

SQLiteDatabase.loadLibs(this) //加载 so库文件,你的厂家的方法应该也是类似。

File databaseFile = getDatabasePath(SQLite_toll.DATABASE_NAME)

databaseFile.mkdirs()

databaseFile.delete()

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, helper_SharedPreferences.get_str_sp("database_cipher",this), null)

SQLite_toll initToll = new SQLite_toll(this, avaSys)

initToll.onCreate(database)

database.close()

//因为我sqlcipher是用于数据库加密的,所以你所看到的都是数据库的一些方法,你厂家提供给你的jar包的用法,你是要去问他们的,或者他们的是否有开源代码,又或者是网上也有很多人使用,那么能搜到相关资料。

根据你补充的提问,那么就是System.loadLibrary(this),就可以调用了

:用JNI实现 实例: 创建HelloWorld.java class HelloWorld { private native void print()public staticvoid main(String[] args) { new HelloWorld().print()} static { System.loadLibrary("HelloWorld")} } 注意print方法的声明,