从不同的Android项目

时间:2017-09-15 12:06:48

标签: java android c android-ndk .so

我使用的是Android Studio版本 - 2.1.2。我在Android中创建了一个项目 - MyNdk 。这个项目使用c程序。 c progarm有一个功能 的 getCountry ()。此功能在 torento.c 文件中创建。 功能是这样的 -

Java_com_myndk_MainActivity_getCountry(JNIEnv *env, jobject instance) **{**

   // TODO
   //return (*env)->NewStringUTF(env, returnValue);

   return (*env)->NewStringUTF(env, "Canada");

**}**

在java文件中,我使用此代码加载库System.loadLibrary(" torento")。 libtorento.so 已创建 成功在所有设备的jni文件夹下。到目前为止没问题,我可以在没有任何错误的情况下调用c程序。

现在我创建了第二个项目 - HelloAndroidJni 。该项目还使用c程序。我想使用 libtorento.so 中的 getCountry ()。 该项目有c程序 paris.c ,它是在jni文件夹下创建的。对于此项目,库是 libparis.so 。 现在我已经创建了一个文件夹 jniLibs ,在该文件夹下我从所有设备的第一个项目中复制了 libtorento.so 。然后我使用以下方法加载了库 java文件中的代码。

static
{
    System.loadLibrary("torento");
    System.loadLibrary("paris");

}

libtorento.so在HelloAndroidJni项目中成功加载。我查了.apk文件。 libtorento.so 存在于.apk文件中。

我的问题是如何在 HelloAndroidJni 项目中调用 getCountry()。我搜索了很多,到处都有教程/样本 其中c程序是从同一个java项目中调用的,在那里定义它。  请帮帮我。

在Android Studio(2.1.2)中,系统生成了jni文件夹和c文件。没有创建头文件。

2 个答案:

答案 0 :(得分:0)

在第二个项目中,您应该创建一个新的Java类com.myndk.MainActivity(我知道它与新项目的主要活动不在同一个Java包中)。您可以从myNdk项目中复制MainActivity.java文件,或者只是创建一个新文件。唯一的要求是该类已定义了本地方法get country()。

现在,您可以在新应用中使用此方法。

答案 1 :(得分:0)

按照你的指示,我在 HelloAndroidJni 中做了这个。我做对了吗?我的班级如下

package com.dsc.bandhan.helloandroidjni;

@SuppressWarnings(" JniMissingFunction&#34) 公共类MainActivity扩展了AppCompatActivity {

TextView txtName;


static
{
    System.loadLibrary("torento");
    System.loadLibrary("paris");

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    txtName=(TextView)findViewById(R.id.txtName);

    txtName.setText(getCountry());


}


public native String getCountry();

}

它不起作用。它显示以下错误 java.lang.UnsatisfiedLinkError:找不到本机方法:com.dsc.bandhan.helloandroidjni.MainActivity.getCountry :()Ljava / lang / String;