我使用的是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文件。没有创建头文件。
答案 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;