我正在深入研究ndk的东西,我已经成功建立了一个简单的库并从我的活动中调用它。
为了测试它,在我使用的Activity
中:
static {
System.loadLibrary("my-lib");
}
public native static String callNativeFunction(Context context);
这意味着调用MyActivity.callNativeFunction(context)
会从我的Cpp函数返回String
值。
我有两个问题:
loadLibrary
是在我的主要活动中制作的,但我希望能够在活动可能关闭时从callNativeFunction
调用IntentService
函数或者从我的应用程序的其他地方。如何正确加载库并在应用程序的所有位置提供它?
由于这是我在项目中使用的一个简单功能,在发布时还有其他特定的功能吗?从https://developer.android.com/studio/projects/add-native-code.html开始,似乎Gradle为所有支持的abis构建并将它们添加到apk中。
答案 0 :(得分:1)
Application
课程中完成。加载库后,您可以从cpp
类申请类:
public class SRApplication extends Application {
static {
System.loadLibrary("my-lib");
}
@Override
public void onCreate() {
super.onCreate();
}
}
CPP:
extern "C"
jstring
Java_com_example_service_ExampleService_getNativeString (
JNIEnv* env,
jobject /* this */) {
return env->NewStringUTF("yo");
}
您的服务:
package com.example.service.ExampleService;
public class ExampleService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
String nativeString = getNativeString();
return null;
}
public native String getNativeString();
}
如果您没有针对不同cpu变体的特定代码,则不需要显式处理任何内容,默认
externalNativeBuild {
cmake {
cppFlags ""
}
}
就足够了。